2010-12-06 71 views
4

我试图检测,在MDI父母,当我的MDI子窗体关闭,并作出相应的反应。 MDI父母不应该做任何事情,直到MDI孩子关闭。这里是我的代码,我不确定我做错了什么,但我添加的表单封闭事件方法从未被称为...C#MDI Parent检测MDI Child何时关闭?

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

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; 
     } 
    } 

感谢您的帮助!

+0

此外,可以使用表格时,有人解释执行的区别关闭与形式结束?我应该使用哪一个? – CODe 2010-12-06 15:50:39

回答

1

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

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

0

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

此外,FormClosing将允许您取消关闭,FormClosed不会给您该选项。

0

请勿使用Closed事件。相反,使用FormClosing事件:通过设置的IsMdiContainer为true

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; 
    } 
} 
0

当标记ParentForm为MdiContainer的ParentForm.ControlAdded事件提高了添加“MDICLIENT”控制父窗体。因此增加MDICLIENT父MDI窗体时,我们可以提高ControlAdded事件的MDICLIENT控制像下面,

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值设置为父窗体时,MdiClient的控件添加事件将增加

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; 
     } 
} 

在上面的这个MdiClient_ControlAdded方法在子窗体添加到Parent MDI窗体时引发。因此,通过提高FormClosing和FormClosed事件的子表单,您可以轻松检测子表单是否关闭。

0

为什么当你只需调用一个MDI Parent到MDI Child的事件处理程序时,你会做很多事情呢?

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

这里objB是我的孩子的形式和我写MDI父里面这个代码:

objB.MdiParent = this; 

objB.Activated += SetupToolStripMenu_PlantMasterRecipe; 

objB.Deactivate += DisposeToolStripMenu; 

objB.Show();