C# 델리게이트를 어떻게 사용해야 하는지 예제를 통해서 살펴보자.
그동안 델레게이트를 어떻게 처리해야 할지 개념이 잡힐 듯 잡힐 듯 하면서도 잘 잡히지 않았는데 구글링하다가 발견한 예제를 통해서 폼간에 값을 어떻게 전달해야 하는지 확실하게 감을 좀 잡은거 같다.
1. 메인 폼(MainForm)에서 자식폼으로 값을 전달해야 할 경우
2. 자식폼에서 메인폼으로 값을 전달해야 할 경우
세가지 경우만 알면 폼간에 값을 넘기는 것에 대한 이해는 다 했다고 볼 수 있다.
ㅇ 델리게이트(delegate)는 Class 밖에 선언한다.
ㅇ 델리게이트 타입과 실행메서드 타입은 동일 해야 한다.
ㅇ 이벤트는 값을 전달하는 쪽에서 선언해야 한다.
namespace DelegatesDemo
{
public delegate void DataPushEventHandler(string value); // 메인폼 --> 자식폼 으로 값 전달 델리게이트
public delegate void DataGetEventHandler(string item); // 자식폼 --> 메인폼으로 값 전달 델리게이트
public partial class MainForm : Form
{
// 값을 보내는 곳의 Form 쪽에 이벤트 선언해야 한다
public DataPushEventHandler DataSendEvent;
public MainForm()
{
InitializeComponent();
}
1. 메인 폼(MainForm)에서 자식폼으로 값을 전달해야 할 경우
=== 메인폼 코드 ===
private void btnOpenFrm1_Click(object sender, EventArgs e)
{
// 같은 폼이 2개 이상 뜨지 않도록 처리하는 코드
foreach (Form openForm in Application.OpenForms)
{
if (openForm.Name == "ChildForm1")
{
if (openForm.WindowState == FormWindowState.Minimized)
{
openForm.WindowState = FormWindowState.Normal;
}
openForm.Activate();
return;
}
}
ChildForm1 frm1 = new ChildForm1();
this.DataSendEvent += new DataPushEventHandler(frm1.SetActionValue1);
frm1.StartPosition = FormStartPosition.Manual;
frm1.Location = new Point(this.Location.X + this.Width + 5, this.Location.Y);
frm1.Show();
}
private void txtParam_TextChanged(object sender, EventArgs e)
{
// 텍스트박스에 값을 입력하면 실시간적으로 자식폼으로 값이 전달됨
DataSendEvent(txtParam.Text);
}
private void btnOpenFrm2_Click(object sender, EventArgs e)
{
// 같은 폼이 2개 이상 뜨지 않도록 처리하는 코드
foreach (Form openForm in Application.OpenForms)
{
if (openForm.Name == "ChildForm2")
{
if (openForm.WindowState == FormWindowState.Minimized)
{
openForm.WindowState = FormWindowState.Normal;
}
openForm.Activate();
return;
}
}
ChildForm2 frm2 = new ChildForm2();
this.DataSendEvent += new DataPushEventHandler(frm2.SetActionValue2);
frm2.StartPosition = FormStartPosition.Manual;
frm2.Location = new Point(this.Location.X + this.Width + 5, this.Location.Y + 100);
frm2.Show();
}
=== 자식폼 코드 ===
public void SetActionValue1(string param)
{
txtParam.Text = param;
}
2. 자식폼에서 메인폼으로 값을 전달해야 할 경우
=== 자식폼 코드 ===
namespace DelegatesDemo
{
public partial class FormDialog : Form
{
// Declare delagete callback function
// 값을 보내는 곳의 Form 쪽에 이벤트 선언해야 한다
public DataGetEventHandler DataSendEvent;
public FormDialog()
{
InitializeComponent();
}
private void btnAdd_Click(object sender, EventArgs e)
{
if (textBoxItem.Text.Length == 0)
{
MessageBox.Show("값이 입력되지 않았습니다");
return;
}
else
{
DataSendEvent(textBoxItem.Text);
}
}
private void btnClose_Click(object sender, EventArgs e)
{
this.Close();
}
}
}
=== 메인폼 코드 ===
private void btnScenario2_Click(object sender, EventArgs e)
{
// 같은 폼이 2개 이상 뜨지 않도록 처리하는 코드
foreach (Form openForm in Application.OpenForms)
{
if (openForm.Name == "FormDialog")
{
if (openForm.WindowState == FormWindowState.Minimized)
{
openForm.WindowState = FormWindowState.Normal;
}
openForm.Activate();
return;
}
}
FormDialog frm3 = new FormDialog();
frm3.DataSendEvent = new DataGetEventHandler(this.Form3DataAction);
frm3.StartPosition = FormStartPosition.Manual;
frm3.Location = new Point(this.Location.X + this.Width + 5, this.Location.Y + 250);
frm3.Show();
}
private void Form3DataAction(string item)
{
listBox.Items.Add(item);
}
예제에 사용된 소스코드가 포함된 자료
본 예제는 http://www.c-sharpcorner.com/uploadfile/mosessaur/winformsdelegates09042006094826am/winformsdelegates.aspx 에서 받은 파일을 더 이해하기 쉽게 파일을 수정했다.
원본 예제는 파일 창 중복체크도 없고, 창을 띄울 때 Location 설정하는 것이 반영되지 않았다.
명칭은 변경해서 이해하기 쉽게 정리를 했다.
출처: http://link2me.tistory.com/928?category=869048 [소소한 일상 및 업무TIP 다루기]
'개발 > C#' 카테고리의 다른 글
C# 웹브라우저 메모리 누수 (0) | 2018.06.08 |
---|---|
C# 델리게이트 (0) | 2018.05.24 |
[그래프] C# 속도계 (Gage) (0) | 2018.04.25 |
[그래프] C# 실시간 그래프 (2) | 2018.04.25 |
[팁] 이벤트, 폼간 데이터 공유 (0) | 2018.04.16 |
[팁] 폼(클래스)간 변수공유 (0) | 2018.04.16 |
C# Resource 이미지 로드 (0) | 2018.04.03 |
Dialog Boxes In C# (0) | 2018.03.20 |