2013-11-01 118 views
1

我試圖創建一個event handler,這樣當用戶選擇close(x)按鈕時,它會提示用戶保存任何未保存的更改。這裏是我的C#代碼:用於關閉Windows窗體應用程序的事件處理程序

private void CloseFileOperation() 
{ 
    // If the Spreadsheet has been changed since the user opened it and 
    // the user has requested to Close the window, then prompt him to Save 
    // the unsaved changes. 
    if (SpreadSheet.Changed) 
    { 
     DialogResult UserChoice = MessageBox.Show("Would you like to save your changes?", "Spreadsheet Utility", 
       MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning); 

     switch (UserChoice) 
     { 
      case DialogResult.Yes: 
       SaveFileOperation(); 
       this.Close(); 
       break; 
      case DialogResult.No: 
       this.Close(); 
       break; 
      case DialogResult.Cancel: 
       return; 
     } 
    } 

    // If the Spreadsheet hasn't been changed since the user opened it, then 
    // simply Close the window. 
    else 
     this.Close(); 
} 

我創建和事件處理MainFram_FormClosing,當用戶選擇關閉(X)按鈕被觸發。

private void MainFrame_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    // Close the Spreadsheet. 
    CloseFileOperation(); 
} 

每當我選擇了關閉按鈕的應用程序崩潰,但..我從this後讀的答覆。我想我違反了Windows 7 Program Requirements。我想我不明白爲什麼這個功能不能輕易完成。

什麼是在這個最好的方法?

+0

把一個破發點,以你的'MainFram_FormClosing'事件和檢查。 – Arshad

+0

如果這很容易,它不會在堆棧上。當事件被觸發時,似乎持續執行CloseFileOperation。 – Jonathan

回答

5

如果您使用的事件處理程序本身,而不是一個單獨的程序,您可以訪問,這將允許您在必要時取消closing的FormClosingEventArgs。您也正在使用this.Close();,剛剛重新啓動的情況下,而不是返回,並讓該事件結束。當我使用此代碼設置爲它工作Win7上的事件處理程序如預期:

private void Form2_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     if(SpreadSheet.Changed) 
     { 
      switch(MessageBox.Show("Would you like to save your changes?", "Spreadsheet Utility", 
       MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning)) 
      { 
       case DialogResult.Yes: 
        SaveFileOperation(); 
        return; 
       case DialogResult.No: 
        return; 
       case DialogResult.Cancel: 
        e.Cancel = true; 
        return; 
      } 
     } 
    } 
1

我的回答是:

1.Don't調用this.close()函數,因爲你已經在閉幕事件。

2.如果你想改變的關閉事件動作(關閉或不關閉),你可以簡單地設置FormClosingEventArgs參數(在下面的代碼五)財產取消真正取消或結束關閉。

3.如果表是不會保存你不需要做任何事情,在這種情況下,形式應該簡單而不提示關閉。因此你可以忽略else塊。

這裏的修改後的代碼是:

如果(SpreadSheet.Changed)

  { 
       DialogResult UserChoice = MessageBox.Show("Would you like to save your changes?", "Spreadsheet Utility",MessageBoxButtons.YesNoCancel,MessageBoxIcon.Warning); 

       switch (UserChoice) 
       { 
        case DialogResult.Yes: 
         SaveFileOperation(); 
         break; 
       case DialogResult.No: 
        break; 
       case DialogResult.Cancel: 
        e.Cancel = true; 
        break; 
相關問題