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

标签 c# .net winforms

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

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

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

所有表单都是数据的细微变化,一种表单的更改可能会影响其他表单中的数据。

TYIA

最佳答案

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

  • 为您的子表单创建一个基类,其中包含当表单上的任何数据更改时要引发的事件。我们称之为FormChanged事件。
  • 向父表单添加一个事件以通知所有子项。我们称之为ChildFormChanged事件。
  • 实例化每个子表单后,让父表单订阅 FormChanged child 的事件,并让新的 child 表单订阅 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();一旦发生任何更改,您希望将其传播到其他子表单。

关于c# - .Net Winforms 通知所有打开的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42107426/

相关文章:

javascript - 使用悬停事件发送垃圾邮件时元素可见性问题

c# - 如何将空格替换为标记结尾和文本开头之间的空格

c# - SEHException 未处理

.net - 访问绑定(bind)到 DataGridView 行的项目 (WinForms)

mysql - 关于更新 MySQL 数据库和我的 devexpress Gauge 值之间的数据问题的数据绑定(bind)问题?

c# - TFS 客户端 QueryHistory - 获取最早的变更集

c# - 应用程序图标不能使用 c# 正确更改

c# - 针对数据库队列管理线程池的最佳方法

c# - 如何在C#-wpf中选择鼠标光标下的特定字符串?

c# - DataGridView,水平滚动时始终保持第一列可见?