2012-05-10 139 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