2010-02-01 73 views
6

如何防止打開多個表單?防止多個表單實例

我在窗體上顯示,但用戶可以再次單擊主窗體和按鈕,打開窗體的另一個實例。

回答

2

兩個選項,這取決於你的需要:

  1. 使用ShowDialog代替Show,這將打開一個模式窗口。如果您不需要主窗體在子窗體打開時處於活動狀態,則這是顯而易見的解決方案。

  2. 或者跟蹤已經在主窗體中打開的窗口,如果窗口已經打開,則不執行任何操作。如果你希望用戶能夠在子表單已經打開的情況下使用主表單,那麼可能需要打開其他表單。

0

禁用主窗體,直到子窗體消失或禁用按鈕。

button_onClick(object Sender, EventArgs e) 
{ 
    Button btn = sender as Button; 
    btn.Enabled = false; 
    Form myform = new MyForm(); 
    myform.Show(); 
} 

當然,你真的應該使用form.ShowDialog()而不是form.Show()如果你想模態行爲。

2

做這樣的事情:

SingleForm myform = null; 

void ShowMyForm_Click(object sender, EventArgs e) 
{  if (myform == null) 
     { 
      myform = new SingleForm(); 
     } 
     myform.Show(); 
     myform.BringToFront(); 
} 
+0

這樣比較好,但它並不能防止用戶意外或故意將主窗體再次帶到最前面。 – 2010-02-01 01:11:01

+0

他沒有說主表單必須留在後臺......他只是不希望用戶能夠打開另一個表單,當按鈕被點擊時......;)但是thx的編輯。 .. 哦......我誤解了我的猜測。我以爲有一個按鈕被點擊時打開了第二個窗體... idk – IAbstract 2010-02-01 01:26:24

+0

我打算添加.ShowDialog()作爲另一個選項,但John K.&Johannes打敗了我 – IAbstract 2010-02-01 01:27:39

1

力表單對象堅持Singleton模式

0

我更喜歡使用泛型和延遲加載來處理我的形式。由於我的所有表單都是從一個基類繼承而來,所以我可以使用相同的方法將表單帶到前面,將它們發送到後面,銷燬它們,啓動它們等。

如果您保留一個表單管理器類負責管理任何已加載的表單,您可以將任何形式帶到您想要的前端,或防止特定表單能夠返回,除非滿足某些標準。

public void LoadForm<T>() where T : MyNameSpace.MyBaseForm 
{ 
    // Load all your code in this joint and just call it when you 
    // need a form. In here, you can determine if a copy of the form 
    // already exists and then bring it forward or not 
}