CancelEventArgs 클래스
CancelEventArgs 는 .NET Framework 이 제공하는 클래스 입니다. 이 클래스는 특정한 기능의 구현이 된 것이 아니라, 몇 가지 프로퍼티가 제공이 되는 것 뿐입니다.
 
CancelEventArgs 클래스의 메타 데이터를 보면 두 개의 생성자와 Cancel 프로퍼티를 제공하는 것을 알 수 있습니다.
 
[그림1] CancelEventArgs 클래스 메타데이타
 
 
예제
그럼 한번 취소 가능한 이벤트를 작성해 보겠습니다.
 
우선 이벤트가 사용할 대리자를 선언해 보았습니다. AfterEventHandler 의 경우 특별히 지정하지 않아도 되지만, 직관적으로 코딩이 나름대로 편하기 때문에 선언해 보았답니다.
public delegate CancelEventHandler BeforeEventHandler(object sender, CancelEventArgs e);
public delegate EventHandler AfterEventHandler(object sender, EventHandler e);
 
다음은 Sample 클래스의 모든 소스를 한번에 보도록 하겠습니다.
 
public class Sample
{
        private object EVENT_BEFORE_EVENT     = null; // Before 이벤트객체
        private object EVENT_AFTER_EVENT      = null; // After 이벤트객체
 
        // 이벤트의수가많아경우, 대부분의이벤트가사용되지않을것이라고예상될경우유용한방법이다.
        // 다음회차에자세히알아보자.
        public event CancelEventHandler BeforeEvent
        {
               add
               {
                       EVENT_BEFORE_EVENT     =
(CancelEventHandler)EVENT_BEFORE_EVENT + value;
               }
               remove
               {
                       EVENT_BEFORE_EVENT     =
(CancelEventHandler)EVENT_BEFORE_EVENT - value;
               }
        }
 
        public event EventHandler AfterEvent
        {
               add
               {
                       EVENT_AFTER_EVENT      = (EventHandler)EVENT_AFTER_EVENT + value;
               }
               remove
               {
                       EVENT_AFTER_EVENT      = (EventHandler)EVENT_AFTER_EVENT - value;
               }
        }
 
        // Before 이벤트를발생한다. private 메서드에주의
        private void OnBefore(object sender, CancelEventArgs e)
        {
               CancelEventHandler handler = (CancelEventHandler)EVENT_BEFORE_EVENT;
 
               if( handler != null )
                       handler(sender, e);
        }
 
        // After 이벤트를발생한다. private 메서드에주의
        private void OnAfter(object sender, EventArgs e)
        {
               EventHandler handler          = (EventHandler)EVENT_AFTER_EVENT;
 
               if( handler != null )
                       handler( sender, e);
        }
 
        // Before, After 이벤트를발생하여 Before 이벤트의 Cancel 여부를판단한다.
        public void OnFire(object sender)
        {
               CancelEventArgs args          = new CancelEventArgs();
               this.OnBefore(sender, args);
 
               if( args.Cancel ) return;
 
               this.OnAfter(sender, EventArgs.Empty);
        }
}
 
여기서 event 를 선언하는 코드가 약간 생소하네요.
 
public event CancelEventHandler BeforeEvent { add; remove; }
 
이 구문은 대부분의 이벤트가 사용하지 않을 것으로 예상될 경우 이벤트의 추가/삭제를 커스트마이징 할 수 있기 때문에 굉장히 효율적인 방법입니다. 여기에서 이벤트는
 
EVENT_BEFORE_EVENT
 
오브젝트(object) 를 통해 추가/삭제 되는 것을 알 수 있습니다. 즉, EVENT_BEFORE_EVENT 오브젝트는 이벤트의 키 값이라고 보셔도 무방할 것 같네요.
 
OnBefore(), OnAfter() 와 같이 실제로 이벤트를 발생하는 메서드는 이미 1,2 회차에서 자주 보셨을 거라 생각합니다. 실제로 가장 중요한 구문은 OnFire() 메서드 입니다. OnFire() 메서드는 참조 타입(클래스)인 CancelEventArgs 클래스의 인스턴스를 생성하여 OnBefore() 메서드에게 넘겨주고 있습니다. Before 이벤트의 실제 구현부가 실행되고 CancelEventArgs 의 Cancel 프로퍼티가 True 가 될 경우 조건문에 의해 더 이상 After 이벤트가 실행되지 않도록 return 이 된답니다.
 
소스 코드에 주석을 잘 보시면서 차근차근 생각하시면 이해가 되실 겁니다.
 
Default.aspx.cs
[그림2] default.aspx 실행결과
 
만약, Before 이벤트 중 이벤트의 진행을 취소하고 싶다면 Cancel 프로퍼티를 True 설정하는 것만으로 이벤트의 진행의 취소가 가능합니다.
 
[그림3] Cancel 프로퍼티를 True 로 설정한 실행결과

저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by 땡초 POWERUMC
TAG ,

댓글을 달아 주세요