2011-05-16 92 views
2

我目前正在構建一個多文檔界面應用程序,但是當通過x按鈕關閉子窗體時我遇到了問題。當表單關閉時,再次顯示的唯一方法是創建該特定表單的新實例,這意味着以前表單中包含的所有數據都將丟失。關閉隱藏MDI子窗體使用C#

我試圖設置窗體關閉事件來簡單地隱藏窗體,但是當用戶關閉主父窗體時,應用程序不會退出。

有沒有辦法解決這個問題?

這是我目前使用的爲我的孩子形式的形式結束活動代碼:

private void ParameterForm_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason != CloseReason.FormOwnerClosing) 
    { 
     this.Hide(); 
     e.Cancel = true; 
    } 
} 

有了這個代碼,主要形式的X按鈕必須被點擊兩次,一次關閉子形式,一次關閉主窗體。

回答

7

形式是打算由用戶打開和關閉。而且,實際上,當它們關閉時,對象實例會遭到破壞,導致您丟失存儲在與該對象實例關聯的字段或屬性中的所有數據。

因此,您不應將表單實例用作存儲數據的永久位置。您需要將這些數據寫入磁盤,將其保存到數據庫中,或者只是將其存儲在您的表單中共享的全部的類實例中(當然,直到您通過代碼明確地執行此操作後纔會銷燬它們,因爲它沒有用戶界面並且不能被用戶「關閉」)。

但是,如果您只是想使這項工作,也可以做到這一點。你需要在你FormClosing事件處理程序改變代碼防止孩子從形式收盤時e.CloseReason屬性表示,他們正在關閉作爲直接用戶互動的結果:

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

的原因,你的檢查不起作用(e.CloseReason != CloseReason.FormOwnerClosing)是因爲你有一個MDI應用程序。當MDI父項關閉時有一個特殊原因:CloseReason.MdiFormClosing。例如,你可以看到也是,但是按照上面的方式進行操作會更簡單,因爲當Windows關閉時,您不希望阻止窗口關閉。

+0

謝謝,這個工程。 – isometrik 2011-05-16 16:28:40