2012-10-25 58 views
0

我在我的應用程序中有兩個窗體,Form1Form2。我想知道是否有更好的方法檢查表單是否已經加載。如果表格是 加載在內存中並且可見,我希望按鈕不做任何事情,如果User 已關閉窗體,它應該重新實例化它。有沒有更好的方法來檢查表單是否被加載?

欲瞭解更多信息請查看我的代碼或評論.. :)

public partial class Form1: Form 
{ 
    private Form2 form2; 

    public Form1() { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) { 

     if (form2== null) { 
      form2= new Form2(); 
     } else { 
      if (form2.has_exited()) { // this is a private property 
             // that I set when Form2.Closing executes 
       form2.Dispose(); 
       form2= new Form2(); 
      } 
     } 
     form2.Show(); 
    } 
} 
+1

退房http://stackoverflow.com/questions/1403600/how-to-avoid-multiple-instances-of-windows-form-in-c-sharp – Matthew

+2

你可以保持形式的實例永遠活着,永遠不會調用它的Close方法,而是隱藏它,然後使用Form2.Visible(true - > shown,false - > hidden) –

+0

這些解決方案看起來都很不錯,但我不知道應該使用哪一個。我選擇正確的答案爲最多票數 – IEnumerable

回答

5

你並不需要有Form2處理關閉事件,你可以做到這一點直接從Form1

private Form2 form2; 

private void button1_Click(object sender, EventArgs e) 
{ 
    if (form2 == null) 
    { 
     form2 = new Form2(); 
     form2.FormClosed += (_, arg) => 
     { 
      form2 = null; 
     }; 
     form2.Show(); 
    } 
    else 
    { 
     //the other form has been opened and not closed; not sure what you want to do 
    } 
} 

還要注意的是,如果通過Show被出示一張表格,你不需要處理的。如果您通過ShowDialog顯示,則可以這樣做,但是當您使用非模態對話框時,系統會自動將事件處理程序附加到調用處理的關閉事件。

+0

Thankyou,工作很好,我喜歡我不必在其他表單上添加參數。非常感謝你。 – IEnumerable

0

你可以通過Form1以窗口2並像.Loaded事件或在部署/在Form2的退出,可以用在Form1反對讓它知道這些事件已經發生。

2

我會使用

if (form2 == null) 
{ 
    form2 = new Form2(); 
    form2.FormClosed += (s, e) => { this.form2 = null; }; 
    form2.Show(); 
} 
form2.BringToFront() 

所以每次form2關閉時,基準設置爲null。下次它可以重新實例化。

只要它仍然存在,就把它放在前面。

+0

好的,這麼多種方法給貓皮...嗯 – IEnumerable

+0

謝謝你這麼多 – IEnumerable

相關問題