2017년 9월 23일 토요일

C# 하위 폼에서 상위 폼의 매서드 호출시키기 (대리자 선언)

하나의 폼 안에 많은 자식 폼들을 생성하여 각각 팝업이나 화면 일부분을 구현 하는 경우가 많습니다.

부모 폼에서는 생성한 자식 폼들의 인스턴스를 가지고 있기 때문에 자식 폼을 컨트롤 하고 객체에 접근하기가 매우 간단합니다.

하지만 반대로 자식 폼 입장에서는 부모 폼의 인스턴스를 가지고 있지 않을 경우엔 부모 폼의 매서드나 객체를 호출하기가 까다롭습니다.

자식 폼에서 이벤트가 발생했을때 필요한 변수와 함께 부모폼에게 이벤트를 전달하거나, 상위 폼의 원하는 매서드를 호출 시키는 방법을 대리자 선언을 통해 알아보겠습니다.


⧫ 기능 정의
1. A와 B 두개의 폼이 있을때 A는 B의 인스턴스를 선언하여 B를 자유롭게 컨트롤 한다.
2. B는 A의 인스턴스를 가지지 않고 필요할때 마다 A에게 이벤트를 호출한다.
3. B에서 A에게 이벤트를 전달할때 마다 원하는 변수로 같이 넘긴다.


⧫ 구현

1. 마스터 폼 디자인

- 크게 두개의 판넬로 반반씩 위치 시켰으며, 왼쪽 판넬에는 전달받은 이벤트를 확인할 레이블과 텍스트 박스를 두었고 오른쪽 판넬에는 생성될 하위폼의 자리를 만들어 두었습니다.

실행된다면 오른편에 하위폼이 보일것이며 이벤트 결과는 왼쪽 레이블과 텍스트 박스에 표현될것 입니다.



2. 서브 폼 디자인
- 유저 컨트롤로 폼을 생성하였으며 중앙에 이벤트를 발생시킬 버튼을 하나 달았습니다.



3. 서브 폼 소스


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public partial class Form2 : UserControl
{
    //Form2 대리자 선언
    public delegate void FormSendDataHandler(Object obj, Object obj2);
    public event FormSendDataHandler form2SendEvent;
    public Form2()
    {
        InitializeComponent();
    }
    //버튼 클릭 이벤트
    private void button1_Click(object sender, EventArgs e)
    {
        //변수1
        string strV1 = "변수1";
        //변수2
        string strV2 = "17.09.23";
        //대리자를 통한 이벤트와 데이터 전달
        this.form2SendEvent(strV1, strV2);
    }
}

- 폼 대리자 선언부와 버튼 클릭 이벤트 크게 두 부분으로 구성되어 있습니다.

2# ~ 3# : 대리자 선언부 입니다. 여기선 변수를 2개 보낼 예정 입니다 변수명과 대리자 이름은 제 임의로 작성하였습니다.

15# ~ 18# : 보낼 변수의 내용을 채웁니다.

21# : 선언한 대리자를 호출하여 대리자가 실행되도록 합니다.



4. 마스터 폼 소스


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
35
36
37
public partial class Form1 : Form
{
    //하위폼
    Form2 form2;
    public Form1()
    {
        InitializeComponent();
        //하위폼
        form2 = new Form2();
        form2.form2SendEvent += new Form2.FormSendDataHandler(receiveFormEvent);
        this.panel2.Controls.Add(form2);
        form2.Dock = DockStyle.Fill;
    }
    //하위폼에서 대리자로 호출된 매서드
    public void receiveFormEvent(Object obj1, Object obj2)
    {
        try
        {
            //변수1
            string strV1 = obj1.ToString();
            //변수2
            string strV2 = obj2.ToString();
            //이벤트와 변수 출력 확인
            label1.Text = "이벤트 수신 완료";
            textBox1.Text = strV1;
            textBox2.Text = strV2;
        }
        catch (Exception exc)
        {
            label1.Text = string.Format("오류 발생 : ",exc.Message);
        }
    }
}

- 하위 폼을 선언하여 배치시키는 부분과 하위폼의 대리자로 실행되는 매서드 두 부분으로 구성되어 있습니다.

4# : 하위 폼 선언
11# ~ 12# : 하위폼 인스턴스를 초기화 한 후 하위폼의 대리자와 실행부를 연결 시킵니다.
13# ~ 14# : 하위폼의 위치를 지정합니다.
18# : 하위폼 대리자를 통해 호출된 매서드 입니다.
23#, 25# : 대리자를 통해 받은 변수를 가공합니다.
28# ~ 30# : 받은 변수와 함께 사용자에게 이벤트 확인용 메시지를 작성합니다.



5. 디버그 실행 순서

- 마스터 폼에서 하위 폼 인스턴스를 생성함과 동시에 하위 폼의 대리자와 연결할 마스터 폼의 매서드를 결정 합니다.

- 하위 폼에서 사용자에 의해 이벤트가 발생되면 대리자명으로 마스터 폼의 매서드를 실행합니다.

- 대리자와 연결된 마스터 폼의 매서드가 실행 됩니다.

- 마스터 폼의 매서드가 종료 되면 하위 폼의 클릭 이벤트 매서드의 남은 부분을 마저 실행 합니다.

- 클릭 이벤트 매서드가 끝나면 디버그를 종료 합니다.

- 대리자로 마스터 폼을 실행하더라도 끝은 하위 폼의 대리자를 보낸 매서드에서 끝나기 때문에 변수 처리나 이벤트 처리에 유의하시면 됩니다. ^^



6. 실행



오타나 잘못된 내용, 질문등은 언제나 환영 입니다. ^^

IT 기술 관련 다른 포스트 보러가기
Share:

댓글 2개:

  1. 제가 만들었는데 가끔 보러오게되네요 ㅋㅋㅋㅋ

    답글삭제
  2. 간결한 핵심 코드에 간결한 설명 너무 훌륭하십니다.
    너무 빨리 이해가 되어서 멘붕 왔습니다.
    고맙, 고맙습니다.

    답글삭제