我是.Net Winforms的新手,我通常使用控制台应用程序或MVC。
我正在开发一个MDI WinForms应用程序,如果我在一个(任何)窗口中进行更改,我需要在进行更改时刷新所有其他打开的MDI表单,以便它们也可以显示更新的数据。
如何实现这一目标 - 在我以前的旧Delphi(v3)中,您曾经“发布”WM_USER类型的消息,并且每个表单都有一个“订阅者处理程序”,然后将采取所需的操作,但这是一个很长的很久以前。
所有表格都是数据的轻微变化,一种形式的变化会影响其他表格中的数据。
TYIA
答案 0 :(得分:1)
答案 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();
。