【问题标题】:.Net Winforms notify all open windows.Net Winforms 通知所有打开的窗口
【发布时间】:2017-02-08 07:47:51
【问题描述】:

我是 .Net Winforms 的新手,我通常使用控制台应用程序或 MVC。

我正在开发一个 MDI WinForms 应用程序,如果我在一个(任何)窗口中进行更改,我需要在更改完成后刷新所有其他打开的 MDI 表单,以便它们也可以显示更新的数据。

如何实现 - 在我以前的 Delphi (v3) 时代,您曾经“发布” WM_USER 类型的消息,每个表单都有一个“订阅者处理程序”,然后会采取所需的操作,但这很长很久以前。

所有表格都是数据的细微变化,一个表格的变化会影响其他表格中的数据..

TYIA

【问题讨论】:

  • 所有的Forms都是同一类型吗(如果是,可以参考这里:stackoverflow.com/questions/4646705/…msdn.microsoft.com/en-us/library/…)?使用它,您可以遍历所有打开的表单,并调用 Refresh() 方法(将其声明为公共)。
  • 不,表单不是同一个表单的多个实例,它们都略有不同..但原则上它会起作用......理想情况下..我只想刷新表单如果它使用已更改的数据的类型(例如,显示某种员工数据的所有表单)
  • 在你的 MDI 父窗体中添加一个事件,所有子窗体都可以订阅它。

标签: c# .net winforms


【解决方案1】:

你需要一个孩子和父母之间的事件系统,可以如下实现:

  • 为您的子表单创建一个基类,其中包含在表单上的任何数据发生更改时要引发的事件。我们称之为FormChanged 事件。
  • 将事件添加到父窗体以通知所有子窗体。我们称之为ChildFormChanged 事件。
  • 在每个子窗体实例化后,让父窗体订阅子窗体的 FormChanged 事件,并让新的子窗体订阅父窗体的 ChildFormChanged 事件。
  • 父窗体中FormChanged 事件的事件处理程序只是一个传递函数,它反过来引发ChildFormChanged 事件,传递从子窗体接收到的信息导致事件触发。李>
  • ChildFormChanged 事件可以在子窗体的基类中通过虚拟事件处理程序(处理通用项)进行处理,虚拟事件处理程序可以在每个子类中被覆盖(处理每个子窗体的细节)。

我用 C# 和 posted it on Github 编写并评论了一个示例应用程序。以下是相关代码:

基础子窗体:

    public event EventHandler<EventArgs> FormChanged;

    public virtual void ProcessChange(object sender, EventArgs e)
    {
        if((sender as Form) != this)
        {
            //Handle change
        }
    }

    protected void NotifyParent() => FormChanged?.Invoke(this, EventArgs.Empty);

父表单:

    public event EventHandler ChildFormChanged;

    public void NotifyAllChildren(object sender, EventArgs e)
        => ChildFormChanged?.Invoke(sender, e);

    //Child form creation function
    private void createNewFormToolStripMenuItem_Click(object sender, EventArgs e)
    {

        MDIChildBase newChild = new MDIChild(); //Can be different child forms
        newChild.MdiParent = this;

        //Parent-child event subscription
        newChild.FormChanged += NotifyAllChildren;
        ChildFormChanged += newChild.ProcessChange;

        newChild.Show();
    }

一旦发生要传播到其他子表单的任何更改,每个子表单都必须调用base.NotifyParent();

【讨论】:

  • 我推测我可以将信息添加到 EventArgs(或自定义)以指定更改类型(员工/股票),然后在子表单中做出适当的反应
  • @ChrisHammond,绝对是,或者声明你自己的委托 - 我使用 EventHandler 使示例快速且易于阅读,因为许多读者都熟悉这个委托。
【解决方案2】:

您仍然可以使用 Windows 消息传递基础结构。解释了herehere

【讨论】:

  • 有点大锤......我想可能会有一些更无缝的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 1970-01-01
  • 2014-03-21
相关资源
最近更新 更多