C#MDI父级检测MDI Child何时关闭?

我试图在MDI父级上检测到我的MDI子窗体何时关闭,并做出相应的反应。 在MDI子项关闭之前,MDI父母不应该做任何事情。 这是我的代码,我不确定我做错了什么,但我添加的表单关闭事件方法永远不会被调用…

如果不明显,则以下代码位于MDI父类中。

private void keyValidation() { if (Properties.Settings.Default.Unlock == true) return; else { menu.Enabled = false; statusStrip.Enabled = false; ValidationForm vf = new ValidationForm(); vf.MdiParent = this; vf.Show(); vf.FormClosed += new FormClosedEventHandler(validationForm_FormClosed); } } void validationForm_FormClosed(object sender, FormClosedEventArgs e) { MessageBox.Show("Got here"); if (Properties.Settings.Default.Unlock == true) { menu.Enabled = true; statusStrip.Enabled = true; } } 

谢谢你的帮助!

虽然这并没有真正解决您所指的问题,但从用例来看,您可能需要考虑将validation表单打开为模式对话框而不是MDI子对象。

您可以使用表单的ShowDialog()方法执行此操作,您现在可以使用Show() 。 请记住,如果将ShowDialog()分配给另一个表单上的按钮,它也可以返回DialogResult

也许,只是也许,你有一个儿童forms隐藏不关闭。 尝试挂钩VisibleChanged,看看会发生什么。

此外,FormClosing将允许您取消关闭,并且FormClosed不会为您提供该选项。

不要使用Closed活动。 而是使用FormClosing事件:

 private void frmMain_FormClosing(object sender, FormClosingEventArgs e){ if (MessageBox.Show("Are you sure you want to Exit", "Confirmation", MessageBoxButtons.YesNo,MessageBoxIcon.Information) == System.Windows.Forms.DialogResult.No) { e.Cancel = true; } } 

通过将IsMdiContainer设置为true将ParentForm标记为MdiContainer时,会引发ParentForm.ControlAdded事件以将“MdiClient”控件添加到父窗体。 因此,当将MdiClient添加到父MDI表单时, 我们可以为MdiClient控件引发ControlAdded事件,如下所示,

  public ParentForm() { InitializeComponent(); this.ControlAdded += Form1_ControlAdded; this.IsMdiContainer = true; 

我们需要像下面一样提高MdiClient.ControlAdded,

  void Form1_ControlAdded(object sender, ControlEventArgs e) { if(e.Control is MdiClient) e.Control.ControlAdded += MdiClient_ControlAdded; } 

默认情况下, MDI子窗体将以父窗体的forms添加到MdiClient的控件集合中 。 因此,当将ChildForm.MdiParent值设置为Parent表单时, MdiClientControlAdded事件将引发

 void MdiClient_ControlAdded(object sender, ControlEventArgs e) { if (e.Control is Form) { var form = e.Control as Form; form.FormClosing += form_FormClosing; form.FormClosed += form_FormClosed; } } 

在上面的内容中,当子表单添加到父MDI表单中时,会引发MdiClient_ControlAdded方法。 因此,通过为子表单引发FormClosing和FormClosed事件,您可以轻松检测子表单是否已关闭。

当您可以调用MDI Parent到MDI Child的事件处理程序时,为什么要执行这么多操作?

假设我的孩子被激活或停用时我想做某些事情。 您只需要声明一些MDI Parent的事件处理程序(例如SetupToolStripMenu_PlantMasterRecipe )并在其中提及您想要执行的操作。 通过这种方式,您可以从MDI Parent控制MDI Child的每个对象行为。

这里objB是我的Child表单,我在MDI Parent中编写这段代码:

 objB.MdiParent = this; objB.Activated += SetupToolStripMenu_PlantMasterRecipe; objB.Deactivate += DisposeToolStripMenu; objB.Show();