WinForms; 从另一个窗口检测窗口关闭

8

能否从另一个窗体检测到表单关闭。 例如。 如果我有一个打开子窗体的主窗体,我是否可以在主窗体内检测到子窗体已关闭并执行代码?

我知道我可以在子窗体中创建事件处理程序,但这不是我想要的,因为我在子窗体关闭后要做的事情是在主窗体中进行的(对主窗体的更改)。

3个回答

16

FormClosed事件是公共的,因此您可以从主表单中创建处理程序。

//Inside main Form.  Click button to open new form
private void button1_Click(object sender, EventArgs e)
{
      Form2 f2 = new Form2();
      f2.FormClosed += F2_FormClosed;
      f2.Show();
}

private void F2_FormClosed(object sender, FormClosedEventArgs e)
{
    MessageBox.Show("Form was closed");
}

我现在感觉很傻,不知道它是公共的,所以我的猜测是创建一个事件。 - EpicKip
我可能在这里做错了什么,但似乎无法使其工作。错误:无法将void转换为FormClosedEventHandler。 - K. Sunki
好像你的代码中有错别字。我上面说得更简洁了,这可能会有所帮助。 - jason.kaisersmith
1
哦,我忘记了重载函数的参数...谢谢,可以了。 - K. Sunki

1
请看public FormClosedEvent。由于修饰符是public,您可以执行以下示例:
SubForm subForm = new SubForm();
subForm.FormClosed += delegate
{
    MessageBox.Show("subForm has closed");
};
subForm.ShowDialog();

上面的示例创建了一个新的表单(类型为SubForm),添加了一个新的事件处理程序来显示一个消息框告诉用户该表单已关闭,最后使用ShowDialog()方法,这将防止用户访问主表单,直到子表单已关闭。

0
通常情况下,这种情况是指“模态对话框”(如消息框及其相关组件)。 通过使用ShowDialog()而不是Show(),可以将每个表单都作为模态对话框打开。
否则,事件方式是唯一的方法。

这与对话框无关,因为他没有指定是对话框。主窗体可能需要在子窗体打开时进行交互。 - EpicKip
由于他没有明确说明这是否涉及对话框,也可能是他不知道编写自己的对话框很简单。实际上只有两种方法。我都提到了。 - Christopher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接