자식폼에서 부모폼으로 이벤트 전달

C# & MFC

자식폼에서 작업을 진행한후 그 결과 값을 부모폼에 적용하고 싶을때가 있다.

여러가지 방법을 적용해서 작업을 할수 있다.

첫번째는 자식폼을 실행할 때 부모폼의 레퍼런스를 넘겨주고 자식폼에서는 넘겨받은

부모폼의 레퍼런스로 데이터를 전달하던지 함수를 실행할수 있다.

부모폼에서 실행하는 코드인데 자식폼을 실행할 때 생성자로 레퍼런스를 넘긴다.

자식폼에서는 레퍼런스를 넘겨받아 부모폼에서 public 으로 설정된 프로퍼티나 함수등을
실행하면된다.
위의 방법은 OOP 에서 약간 어긋나는 방법이라 할수있다. 객체간의 종속적인 연결고리 때문이다.
예로 부모폼의 함수명이나 프로퍼티 명이 바뀌면 자식폼도 같이 바꿔야한다.
그래서 좀더 종속적이지 않은 방법으로 C# 에서는 대리자(delegate)와 이벤트(event) 를 제공한다.

 

시나리오는 자식폼에서 Close 될때 대리자를 실행하면 부모폼에 등록된 함수가 실행되는

과정이다. 먼저 호출되어지는 자식폼에 대리자와 이벤트를 public 으로 등록한다.

[자식폼]

// delegate 이벤트선언

public delegate void FormSendDataHandler(object obj);

public event FormSendDataHandler FormSendEvent;

 

// 창을 닫을 때 FormSendEvent 이벤트를 실행한다. 파라미터로 object 를 하나 넘긴다.

private void btnFormClose_Click(object sender, EventArgs e)

{

   int no = cboDisSystem.SelectedIndex;

   this.FormSendEvent(disSystemNos[no]);

   this.Dispose();

}

[부모폼]

// 자식폼을 실행할 때 자식폼에 설정되어있는 이벤트에 DieaseUpdateEventMethod

// 실행할 메소드명을 등록한다. 자식폼에서 이벤트를 실행하면 이 메소드가 실행될것이다.

private void btnReasonAdd_Click(object sender, EventArgs e)

{

    FrmAdd frm = new FrmAdd ();

    frm.FormSendEvent += new FrmAdd.FormSendDataHandler(DieaseUpdateEventMethod);

    frm.ShowDialog();

}

 

private void DieaseUpdateEventMethod(object sender)

{

    Console.WriteLine("이벤트 실행");

}

 

간단히 정리하자면 자식폼에서는 대리자 이벤트를 등록하고

부모폼에서는 자식폼 실행할 때 다음과 같이 함수를 등록해두면 된다.

frm.FormSendEvent += new FrmAdd.FormSendDataHandler(DieaseUpdateEventMethod);

신고
Posted by 녹두장군
TAG , ,


티스토리 툴바