본문 바로가기
Programming

[C#] .NET Winform Event 만들기 예제

by BTC_AMP 2023. 7. 7.

베하~!

할배즈....입니다.

 

오늘은 Winform Event 만들기 예제입니다!
 
먼저 이벤트란 클래스내에 특정한 일(event)이 있어났음을 외부의 이벤트 가입자(subscriber)들에게 알려주는 기능입니다.
C#에서의 이벤트는 event라는 키워드를 사용하여 표시하며, 클래스 내에서 일종의 필드처럼 정의됩니다.
// 클래스 내의 이벤트 정의
class MyButton
{
   public string Text;
   // 이벤트 정의
   public event EventHandler Click;

   public void MouseButtonDown()
   {
      if (this.Click != null)
      {
         // 이벤트핸들러들을 호출
         Click(this, EventArgs.Empty);
      }
   }
}

// 이벤트 사용
public void Run()
{
   MyButton btn = new MyButton();
   // Click 이벤트에 대한 이벤트핸들러로
   // btn_Click 이라는 메서드를 지정함
   btn.Click += new EventHandler(btn_Click);
   btn.Text = "Run";
   //....
}

void btn_Click(object sender, EventArgs e)
{
   MessageBox.Show("Button 클릭");
}​
  • 이벤트 Click은 외부에서 엑세스할 수 있게 public 필드로 정의되어 있다.
  • MouseButtonDown() 메소드에서 이벤트를 외부로 보내기 전에 이벤트에 가입한 가입자들이 있는지 체크하기 위해 if (Click != null)을 사용한다.
  • 이벤트에 가입하거나 탈퇴하기 위해서는 += (subscribe) 또는 -= (unsubscribe)연산자를 사용한다.
  • 여기서 void btn_Click(object sender, EventArgs e) 메서드는 이벤트핸들러로 사용되고 있다.

 
이벤트: add와 remove

C# 클래스의 속성(Property)에서 get, set 을 사용하듯이 event 에서는 add, remove 를 사용할 수 있다.
속성의 get, set에서 값을 대입하거나 리턴하는 일 이외에 간단한 체크 코드를 실행하는 것처럼 event 의 add, remove문에서도 이러한 코드를 넣을 수 있다.
 
아래 예제에서, add 문은 += 를, remove 문은 -= 을 사용하고 있는데, 이는 _click 이벤트 안에 있는 내부 리스트에 value 델리게이트를 추가하거나 삭제하는 기능을 한다.
 
여러 개의 델리게이트를 가지고 순서대로 호출하는 것을 멀티캐스트(Multicast) 델리게이트라 하는데, 델리게이트는 멀티캐스트를 디폴트로 한다.

만약 add 문에서 +- 대신 = 을 사용하면 이는 기존 InvocationList의 내용을 지우고 할당된 새 value 델리게이트 하나만 추가하게 된다. 이는 특별한 용도로 Singlecast를 구현할 때 사용한다.


class MyButton
{
    // 이벤트 정의하는 다른 방법
    private EventHandler _click;
    public event EventHandler Click
    {
        add
        {
            _click += value;
            // _click = value;   // 싱글캐스트
        }
        remove
        {
            _click -= value;
        }
    }

    public void MouseButtonDown()
    {
        if (this._click != null)
        {
            // 이벤트핸들러들을 호출
            _click(this, EventArgs.Empty);                                
        }
    }

    /* 속성 정의
    private string _name;
    public string Name 
    {
        get
        {
            return _name;
        }
        set
        {
            _name = value;
        }
    }
    */
}

'Programming' 카테고리의 다른 글

안드로이드 앱개발(2) - 로또 번호 생성 앱  (0) 2023.07.20
[Vue] Vue Router  (0) 2023.07.09
안드로이드 앱개발(1)  (0) 2023.07.06
UML : 클래스 다이어그램 표기법  (0) 2023.07.03
AOP란?  (0) 2023.06.26

댓글