2012-05-10 106 views
1

我使用以下代码来显示MDI父窗体中的子窗体。如您所知,单击该按钮将导致出现一个新窗体。继续点击按钮,屏幕将填充空白表格。为了防止这种情况发生,我将创建表单的代码移到了按钮外部。C中mdi父项中的子窗体#

像这样:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    Form2 f2 = new Form2();  

    private void button1_Click(object sender, EventArgs e) 
    { 
     f2.MdiParent = this; 
     f2.Show(); 
    } 

但是当我关闭子窗体,并希望再次打开它,它不会让我。

请帮我解决这个问题。

+0

'窗体2 F2 =新Form2的();'其实创建实例,所以如果你只有一次让它出来,然后不会再被调用。也许你需要的是当关闭事件发生时隐藏(),然后当你点击 – V4Vendetta

回答

5

您需要跟踪表单状态,以便您知道需要创建一个新表单。像这样:

private Form2 f2;  

private void button1_Click(object sender, EventArgs e) 
{ 
    if (f2 == null) { 
     f2 = new Form2(); 
     f2.MdiParent = this; 
     f2.FormClosed += delegate { f2 = null; }; 
     f2.Show(); 
    } 
    else { 
     f2.Activate(); 
    } 
} 
+0

时再次显示()它这样你将所有表单(mdichilds)保存为单独变量(两次) – riffnl

+0

有没有办法当另一个孩子表格已被激活时,防止显示孩子表格? – aliboy38

1

您不想保留所有表单(两次)作为变量。所有mdi表单都会添加到您的MdiChildren集合中。因此,您需要检查是否需要显示您创建的表单。 像这样:

private void button1_Click(object sender, EventArgs e) 
{ 
    Form2 f2 = new Form2(); 
    f2.MdiParent = this; 
    OpenMdiChild(f2); 
} 
private void OpenMdiChild(Form newForm) 
{ 
    bool found = false; 
    foreach (Form frm in this.MdiChildren) 
    { 
     if (frm.GetType() == newForm.GetType()) 
       { 
         frm.Activate(); 
         frm.Focus(); 
         //frm.BringToFront(); 
      found = true; 
      break; 
       } 
    } 
    if (!found) 
    { 
     frm.Show(); 
    } 
} 

如果你希望用户只开1点的形式,你可以在OpenMdi--方法改成这样:

private void OpenMdiChild(Form newForm) 
{ 
    bool found = (this.MdiChildren.Length > 0); 
    if (!found) 
    { 
     foreach (Form frm in this.MdiChildren) 
     { 
      if (frm.GetType() == newForm.GetType()) 
      { 
      frm.Activate(); 
        frm.Focus(); 
        //frm.BringToFront(); 
        found = true; 
       break; 
       } 
     } 
    if (!found) 
    { 
      frm.Show(); 
    } 
    } 
} 
+0

非常感谢您的帮助。但我还有另一个问题:当另一个孩子表格已经被激活时,是否有办法阻止孩子表格被显示? – aliboy38

+0

你觉得:show 1 form only? – riffnl

+0

我的意思是,例如,当显示子form2时,阻止用户打开子Form3或其他子Form,直到他们关闭此当前子窗体,然后才能打开其他子窗体。 – aliboy38