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:

Related Posts:

  • C#에서 데이터 베이스에 연결하고, 쿼리를 실행하는 방법 (Mssql, .net)개념은 잘 알고 있어도 막상 필요할때 코드를 작성할려면 매서드와 순서가 잘 기억나지 않는 애들이죠 ^^ 저도 기억이 나질 않을때를 대비할겸 이번엔 C#에서 디비 연동과 쿼리 실행 부분에 대해서 알아보겠습니다. (DB는 MSSQL을 기준으로 작성합니다만 윈도우 인증 부분을 제외하면 똑같으니 상관 없겠죠) 1.… Read More
  • String을 int로, int를 String으로 형변환 (Java, C#)코딩중에 형변환은 무진장 자주 사용하고 중요하지만 은근히 사용하려면 형식이나 문법이 기억나질 않아 자주 찾아 본 기억이 많아 이렇게 한번 작성합니다. ^^ 저도 이렇게 작성해두고는 또 나중에 언젠가 코딩하다 여길 다시 찾아보게 될꺼 같네요. 우선 자바입니다. 1 2 3 4 5 6 … Read More
  • 변수명을 동적으로 선언해 사용하는 방법! (C#)코드를 짜다 보면 반복문을 이용이거나 기타 여러가지의 이유로 인해 변수의 이름을 동적으로 할당해야 하는 경우가 발생합니다. 1 2 3 4 5 6 7 8 9 10 11 12 //반복문에 의해 반복하는 만큼 변수를 선언해야 하는&nb… Read More
  • C#으로 단어 학습기 만들기 (엑셀, 일본어)예전에 제가 일본어 공부 할 때 엑셀에 단어장을 만들고, 암기 테스트를 쉽게 하도록 도와주는 프로그램을 작성했었는데요. 이 프로그램을 블로그에 소스 코드와 함께 배포했었습니다. (해당 포스트로 이동하기 - 엑셀 데이터를 이용한 단어 연습기 만들기) 그런데 이 학습기는 처음에 제가 학습할 용도로 만… Read More
  • 엑셀 데이터를 이용한 단어 연습기 만들기 (C# 소스, 프로그램 배포 포함)오랜만에 돌아온 C# 이야기는 최근 일본어를 공부할때 단어 암기에 도움이 되기 위해 만든 단어 연습기에 대한 이야기 입니다. 처음에 일본어 한자를 외우기 위해서 엑셀에다 작업을 했었는데요. 이렇게 엑셀에다 단어의 한자, 뜻, 발음, 종류, 난이도 정도를 모르는 단어 위주로 6000여개를 작성하곤 처음… Read More

댓글 2개:

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

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

    답글삭제