개발/C#

[팁] 델리게이트, 폼간 데이터 공유(주거니 받거니)

FA1976 2018. 4. 16. 14:18

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);
}


예제에 사용된 소스코드가 포함된 자료


 DelegatesDemo.zip


본 예제는 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