2016-09-22 38 views
0

我有2個窗體窗體。Form1和form2都有一個按鈕。當我點擊form1中的按鈕時,它會顯示form2,反之亦然。但是當我每次點擊按鈕時它會創建一個重複的表單。如何避免它。請告訴我。我的代碼如下。避免在c#中重複窗體加載

Form1中:

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

窗體2:

private void button1_Click(object sender, EventArgs e) 
{ 
    Form1 f1 = new Form1(); 
    f1.Show(); 
} 
+2

不要'新每次都有新的表單。將它們創建爲隱藏('OnLoad'),並且只有'.Show()'按鈕單擊 – Liam

+1

,因爲每次單擊按鈕時都會創建新的窗體實例。 – Mostafiz

+0

如何操作?請告訴我... – lijo

回答

0

的問題是,你正在創建每次單擊該按鈕的新形式。 要解決此問題,您可以使表單靜態。

static Form1 form = new Form1(); 
    private void button1_Click(object sender, EventArgs e) 
    { 
     form.Show(); 
    } 
+1

如果表單關閉,該怎麼辦? –

0

我的解決方案,你可以嘗試

Form1中

private void button1_Click(object sender, EventArgs e) 
      { 
       FormCollection fc = Application.OpenForms; 
       bool present = false; 

       foreach (Form frm in fc) 
       { 

        if (frm.Name == "Form2") 
        { 
         present = true; 
        } 
       } 

       if (!present) 
       { 
        Form2 f2 = new Form2(); 
        f2.Show(); 
       } 
      } 

窗體2

private void button1_Click(object sender, EventArgs e) 
     { 
      FormCollection fc = Application.OpenForms; 
      bool present = false; 

      foreach (Form frm in fc) 
      { 

       if (frm.Name == "Form1") 
       { 
        present = true; 
       } 
      } 

      if (!present) 
      { 
       Form1 f1 = new Form1(); 
       f1.Show(); 
      } 
     } 
+0

當我單擊form2中的按鈕時它不工作 – lijo

+0

你的意思是不工作? form2之後你想要form1消失嗎? – Mostafiz

+0

我的目的是當我點擊form1中的按鈕然後form2將被打開。同樣,當我點擊form2中的按鈕時,它再次顯示form1。但在這裏,當我單擊form2中的按鈕時,它不顯示任何內容。 – lijo

1

只是用這種方法常見並傳遞參數,如 '這個' 時按鈕點擊

public bool formIsExist(Form frmOpen) 
    { 
     FormCollection fc = Application.OpenForms; 

     foreach (Form frm in fc) 
     { 
      if (frm.Name == frmOpen.Name) 
      { 
       return true; 
      } 
     } 

     return false; 
    } 
+0

這決定了表單是否已經打開,但它沒有提供將它放在前面的方法。 –

0

最簡單的方法是確定目標窗體是否已經存在,並在這種情況下打開它。

例如,在Form1做到這一點:

private void button1_Click(object sender, EventArgs e) 
{ 
    Form2 f2 = null; 
    for (int i = 0; i < Application.OpenForms.Count; i++) 
    { 
     if (Application.OpenForms[i] is Form2) 
     { 
      f2 = Application.OpenForms[i]; 
      break; 
     } 
    } 

    if (f2 == null) 
     f2 = new Form2(); 

    f2.Show(); 
} 

爲了一個共同的方法對各種形式,你可以試試這個:

public static T GetForm<T>() where T : Form 
{ 
    for (int i = 0; i < Application.OpenForms.Count; i++) 
    { 
     if (Application.OpenForms[i] is T) 
      return (T)Application.OpenForms[i]; 
    } 

    return null; 
} 

,並調用它像:

Form2 f2 = GetForm<Form2>(); 
if (f2 == null) f2 = new Form2(); 
0

@Mostafiz的答案几乎是正確的。它只是錯過了代碼來顯示找到的現在的形式。 (對不起,還沒有50聲譽寫這作爲註釋)

試試這個代碼:

Form1中:

private void button1_Click(object sender, EventArgs e) 
{ 
    Form form = null; 

    //search all opened forms for one with name "Form2" 
    foreach(Form frm in Application.OpenForms) 
     if(frm.Name == "Form2") //this requires Form2 to be named "Form2" 
     { 
      form = frm; 
      break; 
     } 

    //if no opened Form2 was found, create a new one 
    if(form == null) 
     form = new Form2(); 

    form.Show(); 
} 

窗體2:

private void button1_Click(object sender, EventArgs e) 
{ 
    Form form = null; 

    //search all opened forms for one with name "Form1" 
    foreach(Form frm in Application.OpenForms) 
     if(frm.Name == "Form1") //this requires Form1 to be named "Form1" 
     { 
      form = frm; 
      break; 
     } 

    //if no opened Form1 was found, create a new one 
    if(form == null) 
     form = new Form1(); 

    form.Show(); 
}