我是 .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/