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

时间:2010-12-06 15:49:34

标签: c# mdi mdichild mdiparent formclosing

我试图在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;
        }
    }

感谢您的帮助!

6 个答案:

答案 0 :(得分:1)

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

您可以使用表格ShowDialog()方法执行此操作,现在您已Show()。请注意,ShowDialog()如果您将其分配给其他表单上的按钮,也可以返回DialogResult

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

请勿使用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;
  }
}

答案 3 :(得分:0)

通过将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子窗体将以父窗体的形式添加到MdiClient 的控件集合中。因此,当将ChildForm.MdiParent值设置为Parent表单时,MdiClient的 ControlAdded事件将引发

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事件,您可以轻松检测子表单是否已关闭。

答案 4 :(得分:0)

当你可以调用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();

答案 5 :(得分:0)

在mdiparent上公开功能

public void MakeMenuVisible()
{
MainMenu.visible = true;
}

然后在子窗体上,您可以运行如下功能

private void ChildForm_FormClosed(object sender, FormClosedEventArgs e)
{
//Cast MdiParent to Mainform
((mainform)this.MdiParent).MakeMenuVisible();  
}
相关问题