2011-02-28 57 views
11

使用FormClosing事件時,爲什麼代碼e.Cancel = true;可以正常工作,但new CancelEventArgs().Cancel = true;不起作用?「e.Cancel」in formclosing事件

private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
{ 
    e.Cancel = true; 

    new CancelEventArgs().Cancel = true; 
} 
+4

因爲一個是取消formclose事件的正確方法,另一個是全部垃圾。 – Jamiec 2011-02-28 13:29:05

+14

@Jamiec:「垃圾總數」不是很具描述性,因此不是很有幫助。沒有對對象實例的理解,很容易看到這裏可能會有人困惑。我同意這個解釋很簡單,但並不像「全部垃圾」那麼簡單。 – 2011-02-28 13:44:17

回答

20

事件由Winforms管道代碼引發。通過e對象可以看到自定義事件處理程序想要改變默認行爲的唯一方法。創建一個新的CancelEventArgs對象沒有配管可以檢測到的副作用。

還有其他的錯誤,事件是爲了外部代碼的好處而提出的,讓它知道發生了什麼並給它一個改變行爲的選項。這裏沒有外部代碼,事件處理程序實際上是引發事件的同一類的一部分。換句話說,表單正在傾聽自己的事件。有一個更好的方法來處理這個問題,你重寫引發事件的方法。就像這樣:

protected override void OnFormClosing(FormClosingEventArgs e) { 
     e.Cancel = true; 
     base.OnFormClosing(e); 
    } 

現在外部代碼可以覆蓋默認行爲,事件被觸發的OnXxxx方法運行後。如果您不希望外部代碼覆蓋行爲,只需交換兩條語句即可。

15

你有什麼期望new CancelEventArgs().Cancel = true;後跟一個右括號呢?您正在創建一個CancelEventArgs類的新實例,在其上設置一個值,然後丟棄所有這些艱苦工作的結果。

那行代碼很可能按照它應該的那樣工作。

6

此代碼確實工作得檢查

protected override void OnFormClosing(FormClosingEventArgs e) 
     {    
      base.OnFormClosing(e); 
      if (PreClosingConfirmation() == System.Windows.Forms.DialogResult.Yes) 
      { 
       Dispose(true); 
       Application.Exit(); 
      } 
      else 
      { 
       e.Cancel = true; 
      } 
     } 

     private DialogResult PreClosingConfirmation() 
     { 
      DialogResult res = System.Windows.Forms.MessageBox.Show(" Do you want to quit?   ", "Quit...", MessageBoxButtons.YesNo, MessageBoxIcon.Question); 
      return res; 
     } 

編碼快樂

3

這是因爲CancelEventArgs是傳遞給在代碼中的事件處理程序的對象引用。幕後代碼用CancelEventArgs對象提出FormClosing對象,並且所有事件處理程序都接收同一個對象。一旦所有的處理程序輪到他們,場景代碼將檢查它發送的CancelEventArgs對象,看它的Cancel屬性是否設置爲true。如果是,它什麼也不做,事件鏈將停止。如果CancelfalseCancelEventArgs默認值),意味着它沒有被設置爲Cancel事件鏈,則幕後代碼繼續前進,然後引發FormClosed事件。

您可以在Form.FormClosing Event on MSDN瞭解更多。

Forms所有的事件後面都會跟着一個-ed事件。 -ing事件通常具有CancelEventArgs,其Cancel屬性可設置爲true以停止發生-ed事件。

相關問題