2011-02-28 9 views
11

이벤트를 사용할 때 e.Cancel = true; 코드가 작동하지만 new CancelEventArgs().Cancel = true; 코드가 작동하지 않는 이유는 무엇입니까?이벤트 완료시

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

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

formclosing 이벤트를 취소하는 올바른 방법이고 다른 하나는 전체 정크입니다. – Jamiec

+14

@Jamiec : "전체 쓰레기"는 설명 적이 지 않아서별로 도움이되지 않습니다. 객체 인스턴스화에 대한 이해가 없으면 여기에서 어떻게 혼란 스러울지를 쉽게 알 수 있습니다. 나는 설명이 간단하다는 데 동의하지만, 그것은 "총 쓰레기"처럼 단순하지는 않다. –

답변

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; 
     } 

해피 CancelEventArgs 코드에서 이벤트 처리기에 전달 된 객체 참조입니다 때문입니다

3

코딩 확인 작업 할 수 있습니다. 장면 뒤 코드는 CancelEventArgs 개체로 FormClosing을 발생시키고 모든 이벤트 처리기는 동일한 개체를받습니다. 일단 모든 처리기가 자신의 차례가되면 장면 코드는 CancelEventArgs 개체를 확인하여 Cancel 속성이 true으로 설정되어 있는지 확인합니다. 그럴 경우 아무 것도하지 않고 FormClose 이벤트 체인이 중지됩니다. Cancelfalse (CancelEventArgs 기본값)이면 이벤트 코드 체인이 Cancel으로 설정되지 않았고 장면 코드가 진행되고 FormClosed 이벤트가 발생합니다.

Form.FormClosing Event on MSDN에서 자세한 내용을 볼 수 있습니다.

Forms에서 모든 -ing 이벤트는 일반적으로 -ed 이벤트 다음에옵니다. -ing 이벤트는 일반적으로 CancelEventArgs이며, Cancel 속성을 true으로 설정하면 -ed 이벤트가 중지됩니다.

관련 문제