我希望在表单2关闭时刷新表单。我知道要使用表单2中的结束事件,但这就是我迷失的地方。
由于
答案 0 :(得分:4)
实现此目的的一个好方法是使用Mediator模式。通过这种方式,您的表单不必彼此了解。允许调解员管理表格之间的互动,这样每个表格都可以集中精力完成自己的职责。
一个非常粗糙的Mediator,可以达到你想要的效果,可以这样实现:
public class FormMediator
{
public Form MainForm { private get; set; }
public Form SubForm { private get; set; }
public void InitializeMediator()
{
MainForm.FormClosed += MainForm_FormClosed;
}
void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
SubForm.Refresh();
}
}
现在,只要主窗体关闭,您的子窗体就会更新,并且两者都不必了解彼此。
修改强>
好的,所以我将把这个解决方案拿出来让你开始,但请注意,这只是Mediator模式的基本实现。我强烈建议你阅读一下这种模式,并一般地设计模式,以便更好地了解正在发生的事情。
同样,这是一个示例,但它确实有一些基本的错误检查,应该让你去。
您的表单声明将如下所示:
public partial class MainForm : Form
{
private FormMediator _formMediator;
public MainForm()
{
InitializeComponent();
}
public void SomeMethodThatOpensTheSubForm()
{
SubForm subForm = new SubForm();
_formMediator = new FormMediator(this, subForm);
subForm.Show(this);
}
}
Mediator的修改后实现如下:
public class FormMediator
{
private Form _subForm;
private Form _mainForm;
public FormMediator(Form mainForm, Form subForm)
{
if (mainForm == null)
throw new ArgumentNullException("mainForm");
if (subForm == null)
throw new ArgumentNullException("subForm");
_mainForm = mainForm;
_subForm = subForm;
_subForm.FormClosed += MainForm_FormClosed;
}
void MainForm_FormClosed(object sender, FormClosedEventArgs e)
{
try
{
_mainForm.Refresh();
}
catch(NullReferenceException ex)
{
throw new InvalidOperationException("Unable to close the Main Form because the FormMediator no longer has a reference to it.", ex);
}
}
}
答案 1 :(得分:2)
一种解决方案是在构造函数中将Form1的引用传递给Form2,并在Form2的结束事件上调用f1.Invalidate(true)。