2009-08-10 51 views
1

我正在編寫一個程序,使用2種形式,即主要形式和配置形式,因此當用戶單擊工具欄菜單 - >首選項時,將顯示首選項表單並且我希望它用戶一次只能有一個首選項形式。使用表格

當我使用:

Prefs preferencias = new Prefs; 

    private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     preferencias.Show(); 
    } 

它的工作原理,但是當我關閉首形式,並嘗試打開一個新的程序崩潰。

,當我使用:

private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     Prefs preferencias = new Prefs; 
     preferencias.Show(); 
    } 

用戶可以甲肝多首形式。

我該怎麼辦?

在此先感謝。

回答

5

這聽起來像你想有一個模態對話框,所以你需要使用的ShowDialog()方法,而不是顯示():

private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    preferencias.ShowDialog(); 
} 
1
preferencias.ShowDialog() 

將只允許一個偏好窗口打開。

0

您可以在菜單項的點擊事件中使用Application.OpenForms屬性檢查該類型的表單是否已經打開。如果沒有該類型的表單打開,則可以打開您的實例。如果有,它就不會顯示。

foreach (Form form in Application.OpenForms) { 
    if (form.GetType() != typeof(PreferencesForm)) { 
     new PreferencesForm().Show(); 
    } 
} 

或者如前所述,你可以調用PreferencesForm.ShowDialog()使窗體模式,在這種情況下,用戶必須關閉窗體之前,他們甚至可以與主要形式再次進行互動。

,如果你希望用戶能夠使用,即使喜好形式是開放的主要形式您使用的方法取決於。

+0

這似乎有點落後,但它會工作,如果你不想Preferences對話框是模態(這似乎像明顯的選擇,雖然) – 2009-08-10 18:31:29

+0

更新我的職務與第一種方法背後的原因。 – 2009-08-10 18:32:40

0

如果您正在尋找且只有1個,你可能想實現Singleton pattern的偏好設置類。

+0

我認爲當OP只需要一個模態對話框時就會過度。 – 2009-08-10 18:36:02

2

其他人建議的ShowDialog()是一個很好的答案。如果你有興趣的替代,這裏的東西我有時候做:

private void FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.UserClosing) 
    { 
     e.Cancel = true; 
     Hide(); 
    } 
} 

這樣做是隻是隱藏的形式,這樣,如果你再次顯示它,它已經加載到內存中。另外,如果你有一個計時器或其他線程在運行,它仍然可以運行並完成它的工作。