.Net Winforms通知所有打开的窗口

时间:2017-02-08 07:47:51

标签: c# .net winforms

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

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

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

所有表格都是数据的轻微变化,一种形式的变化会影响其他表格中的数据。

TYIA

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

您需要在子级和父级之间建立一个事件系统,可以按如下方式完成:

  • 为您的子表单创建一个基类,其中包含在表单上的任何数据更改时要引发的事件。我们称之为FormChanged event。
  • 向“父”表单添加事件以通知所有子项。我们称之为ChildFormChanged event。
  • 在实例化每个子表单时,让父表单订阅子节点的FormChanged事件,并让新的子表单订阅父表单的ChildFormChanged事件。
  • 父表单中FormChanged事件的事件处理程序只是一个传递函数,它反过来引发ChildFormChanged事件,传递从子表单接收的信息,从而导致事件发生火。
  • 可以通过虚拟事件处理程序(处理通用项)在子类的基类中处理ChildFormChanged事件,该事件处理程序可以在每个子类中重写(以处理每个子表单的细节)。 / LI>

我在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();