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:

  • 윈도우 7과 10에서 FTP 서버를 설정하는 방법 총 정리! (2편 - 계정 관리)FTP 서버 설정 방법 1편 링크 전편에서 FTP 서비스 기본 설정을 하는 방법과 실행을 위한 설정 과정을 알아 보았으며 익명으로 FTP에 접속하는 방법까지 했었는데요. 이번에는 FTP에 접속할 계정을 만들고 관리하는 방법과 계정간 격리를 통해 고유 폴더를 설정하는 방법에 대해 알아보겠습니다. FT… Read More
  • Visual Studio에서 PDB 파일을 찾거나 열 수 없습니다 에러 해결 방법 (C,C++,C#,.NET)비주얼 스튜디오를 사용해서 프로그램 작성하다보면 한번쯤은 겪을 에러인 PDB 파일에 대한 에러 해결방법에 대해 알아보겠습니다. 오늘도 역시 새 프로젝트를 하나 생성하고 시작 스레드에 가볍게 하나를 작성하고 디버깅을 실행하니 코드라곤 콘솔에 문자 한 줄 작성하는거 밖에 없는데 디버깅을 실행하지 못… Read More
  • C# TCP/IP 서버 만들기 (콘솔, 소켓통신)일전에 C#으로 TCP/IP 서버를 만드는 포스트를 작성하긴 했지만 (윈폼 형태로 작성한 소켓 통신 서버 프로그램) (윈폼 형태의 서버 프로그램 포스트 = 이동하기) 스레드도 들어가고 하니 소켓 통신만을 위한 소스만 필요한 분도 계실꺼 같아 소켓 통신 관련된 간단한 서버 프로그램도 하나 더 만들었… Read More
  • C#으로 TCP/IP 서버 만들기이번에는 C#으로 TCP/IP 프로토콜을 지원하는 서버를 만들어 보겠습니다. ^^ 통신 관련 프로그램을 작성할 때 테스트에 꼭 필요한 녀석이라 임시로 만들곤 했었는데 이번에 생각난김에 조금 정리한걸 블로그에 올려봅니다. 서버 실행 파일 다운로드 링크 - 다운로드 소스 코드 다운로드 링크 - … Read More
  • 윈도우 7과 10에서 FTP 서버를 설정하는 방법 총 정리! (1편 - 서버 설정)윈도우에서 FTP 서버를 개설하고 설정하는 방법과 계정과 폴더를 관리하는 방법들 중 우선 FTP 서버 개설과 설정 하는 방법에 대해 알아보겠습니다. 포스트에서 설명하는 대상은 윈도우10 버전이지만 7도 큰 차이가 없으니 함께 보셔도 괜찮습니다. ^^ 윈도우는 자체적으로 닷넷 기반의 서버인 IIS(인터넷 정보 … Read More

댓글 2개:

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

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

    답글삭제