2010-02-05 27 views
2

我有一個按鈕單擊事件處理程序,它說this.Close()FormClosing上需要新線程?

在FormClosing事件中,我檢測到未保存的更改並說「你想保存嗎?

如果他們說是的,我設置e.Cancel = true,然後調用我的Save方法。如果數據在我的Save方法中保存完好,我會說this.Close(),但窗體保持打開狀態。

這似乎是一個這麼簡單的想法,但我無法解決這個問題。

我需要創建的FormClosing新的線程,所以如果他們說的是設置e.Cancel = TRUE,並創建一個新的線程來完成保存,然後將調用this.Close()

+1

請爲所有聖潔的愛**不要**調用this.Close()從窗體的關閉事件。另見:無限遞歸。 – Powerlord 2010-02-05 18:56:41

回答

2

如果他們說是的,我設置了e.Cancel = true,然後調用我的Save方法。如果數據在我的Save方法中保存完好,那麼我會說this.Close(),但窗體保持打開狀態。

更改此處。

  • 提示用戶
  • 如果他們說是,設置e.Cancel = !Save()
  • 如果他們說沒有,設置e.Cancel = true

這將使形式密切除非他們說沒有提示的情況下,或者Save()例程失敗。不需要新線程或線程,只需要稍微改變邏輯。

+0

目前,Save方法不返回布爾值,所以我需要這樣做。謝謝 – Jon 2010-02-05 18:58:36

+0

那麼,你提到保存可能會失敗 - 如果保存失敗,這只是設置e.Cancel == true的問題。然而,使Save()返回一個布爾值會使這個變得簡單。 – 2010-02-05 19:09:00

3

這聽起來像你想要做的是沒有設置e.Cancel爲true,而是從FormClosing有條件地調用Save()。如果保存失敗,您只能取消。例如:

private void OnFormClosing(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    if (IsDataModified()) // check if the data is unsaved...however you do so 
    { 
     // display a message asking the user to save changes or abort. 
     if(MessageBox.Show("Do you want to save your changes?", 
         "My Application", 
         MessageBoxButtons.YesNo) == DialogResult.Yes) 
     { 
      if(!SaveChanges();) 
       e.Cancel = true; // save did not succeed! 
     } 
    } 
} 
+0

目前,Save方法不返回布爾值,所以我需要這樣做。謝謝 – Jon 2010-02-05 18:59:04

+0

@Jon:根據可能導致Save保存成功/失敗的條件,您可能還需要在'OnFormClosing'的調用周圍添加一個'try/catch'。我不會使用異常作爲流量控制的手段 - 但是,當用戶正在退出時,讓您的應用崩潰並出現未處理的異常是不可取的。 – LBushkin 2010-02-05 19:15:19