2011. 9. 9. 12:32

C++에 함수 콜백이 있다면 C#에는 이벤트가 있죠.
이벤트라는 것은 특정 행위가 일어났을 때 이것을 외부로 알리기 위한 도구입니다.

 

 

0. 이벤트 사용

설마 이 글을 읽으면서 아직도 이벤트 연결을 못 하는 사람이 있을 거라는 생각은 하지 않지만....그래도 모르니 ㅎㅎㅎ

 

1
2
3
4
5
6
7
8
9
10
생성자()
{
    //템프 연결
    this.insSkype.OpenCompleteEvent += new claSkype.OpenCompleteEventHandler(insSkype_OpenCompleteEvent);
}
void insSkype_OpenCompleteEvent(object sender, claSkype.OpenCompleteEventArgs e)
{
    MessageBox.Show(e.Temp.ToString());
}
 
cs

 

 

 

+=을하는 순간 자동생성 할건지 물어봅니다.
여기서 탭키를 누르면 이벤트가 자동으로 생성됩니다.

 

1. 일반적인 이벤트 형태

일반적으로 사용되는 이벤트들(클릭이나 온로드 같은...)의 형태로 선언하는 방법입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#region 오픈 이벤트가 완료되면 발생 합니다. 발생하는 이벤트
    public delegate void OpenCompleteEventHandler(object sender, OpenCompleteEventArgs e);
 
    /// <summary>
    /// 오픈 이벤트가 오면 발생합니다.
    /// </summary>
    public event OpenCompleteEventHandler OpenCompleteEvent;
 
    protected virtual void OnOpenComplete(OpenCompleteEventArgs e)
    {
        if (OpenCompleteEvent != null)
        {
            OpenCompleteEvent(this, e);
        }
    }
 
    public class OpenCompleteEventArgs : EventArgs
    {
        public int Temp = 0;
        public OpenCompleteEventArgs(int Temp)
        {
            this.Temp = Temp;
        }
    }
 
    /// <summary>
    /// 오픈 완료 이벤트
    /// </summary>
    private void OpenComplete(int Temp)
    {
        OpenCompleteEventArgs e = new OpenCompleteEventArgs(Temp);
        OnOpenComplete(e);
    }
#endregion
cs

 

 

'OpenCompleteEventArgs'는 일반적인 클래스 형태이기 때문에 매개변수를 지정할 수 있습니다.

해당 매개를 지정하여 필요한 정보를 넘기고 쓰는 쪽에서는 e. 값으로 사용할수 있습니다.

'OpenComplete'은 이벤트 발생을 공통화 시키기 위해 사용하는 함수로 일반 코드에서 동일하게 코딩하면 동일하게 동작합니다.

 

 

2. 간소화된 방법

위코드는 복잡합니다.
이벤트를 발생시킨 클래스의 정보가 필요 없다면 더더욱 복잡하죠 ㅎㅎㅎ

이럴 때 사용하는 것이  간소화 방법입니다.

 

1
2
3
4
5
6
7
public delegate void ReloadPageDelegate(int Temp);
public event ReloadPageDelegate OnReloadPage;
 
private void ReloadPage(int Temp) 
    OnReloadPage(Temp);
}
cs

 

 

'ReloadPage'를 호출하면 동일하게 동작하는 것을 확인 할 수 있습니다.

 

 

 

3. 간소화된 표준 방법

간단하게 이벤트를 구현하면서도 표준이벤트를 이용하여 구성하는 방법입니다.

 

 

1
2
3
4
5
6
7
8
9
10
11
12
/// <SUMMARY>
/// 클릭 이벤트
/// </SUMMARY>
public event EventHandler OnClick;
 
public void ButtonClick(object sender, EventArgs args)
{
    if (OnClick != null)
    {
        OnClick(this, args);
    }
}
cs

 

 

'ButtonClick'를 호출하면 원하는 동작이 가능합니다.

 

 

마무리

그때그때 상황에 맞는 걸 쓰시면 되겠습니다.

  1. ㅇㅇ 2020.02.06 11:11  Address  Edit/Delete  Reply

    저 자동생성으로 만들어지는 메소드를 소문자로 시작하게할수있는 방법이있나요?
    첫번쨰사진만 소문자로시작하지 나머지는전부 대문자이길래요

    • Favicon of https://blog.danggun.net BlogIcon 당근천국 2020.02.06 17:18 신고  Address  Edit/Delete

      예전에는 무조건 변수명 따라서 생성되었는데...
      C#은 파스칼 케이스가 권장사항이라 특정버전부터 첫문자는 강제로 대문자로 변경된걸로 이해하고 있었는데....버그였나보네요.

      윈폼의 경우 디자이너에서 더블클릭하여 생성되는 이벤트는 Visual Studio 2019 16.3 버전 이후로는 컨트롤명을 따라 생성됩니다.

      수동으로 연결하는 이벤트는 자동생성된 함수명을 확정짓기전에 수정하는 방법뿐이 없습니다.

      참고 : https://developercommunity.visualstudio.com/content/problem/524004/winforms-the-default-frist-letter-of-any-control-e.html

댓글 작성

이름
패스워드
홈페이지
비밀글