我是.Net Winforms的新手,我通常在控制台应用程序或MVC上工作。
我正在开发MDI WinForms应用程序,如果我在一个(任何)窗口中进行了更改,则在进行更改后,我需要所有其他打开的MDI表单进行刷新,以便它们也可以显示更新的数据。
如何实现-在我过去的Delphi(v3)时代,您曾经“发布” WM_USER类型的消息,并且每个表单都有一个“订户处理程序”,然后将采取必要的措施,但这已经很久了。
所有形式都是数据的细微变化,一种形式的更改会影响另一种形式的数据。
TYIA
最佳答案
您需要一个在子级与父级之间的事件系统,可以通过以下方式完成:
为您的子表单创建一个基类,该基类包含当表单上的任何数据更改时要引发的事件。我们称之为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();
。