[C#] 이벤트 게시 및 수신

728x90


form1.cs (이벤트 구독자)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp5
{
    public partial class Form1 : Form
    {
        //이벤트 구독자
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Form2 form2 = new Form2();
            form2.myFirst += Sum; //Sum 메서드가 수신
            form2.mySecond += LabelChange;
            form2.Show();

            Form3 form3 = new Form3();
            form3.mySecond += StrInfo; //Sum 메서드가 수신
            form3.Show();
        }

        private void Sum(int a) //form2의 myFirst의 메서드의 매개변수 타입과 동일한 타입으로 매개변수를 지정해야 한다.
        {
            //myFirst 이벤트 함수를 여기서 받음
            MessageBox.Show("" + a);
        }

        public void StrInfo(string ab)
        {
            MessageBox.Show(ab);
        }

        public void LabelChange(string aa)
        {
            //다른 스레드에서 발생시킨 이벤트일 경우에도 크로스 스레드 처리를 해줘야 함
            this.BeginInvoke(new Action(() =>
            {
                label1.Text = aa;
            }));
            
        }
    }
}

 

 

form2.cs(이벤트 게시자)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp5
{
    public partial class Form2 : Form
    {
        //이벤트 게시자

        public delegate void OnMyFirstHandler(int a);
        ///위아래는 같은 메서드명으로 해야함
        public event OnMyFirstHandler myFirst;

        public delegate void OnMySecondHandler(string a);
        public event OnMySecondHandler mySecond;


        Thread thread = null;
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            thread = new Thread(new ThreadStart(threadTest));
            thread.IsBackground = true;
            thread.Start();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            myFirst(5); //이벤트 발생 및 게시
        }

        private void threadTest()
        {
            mySecond("form2에서 제목변경 이벤트");
        }
    }
}

 

form3.cs(이벤트 게시자)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApp5
{
    public partial class Form3 : Form
    {
        //이벤트 게시자
        public delegate void OnMySecondHandler(string ab); //타입에는 string.object등 모두 가능
        ///위아래는 같은 메서드명으로 해야함
        public event OnMySecondHandler mySecond;

        public Form3()
        {
            InitializeComponent();
        }

        private void Form3_Load(object sender, EventArgs e)
        {
            
        }

        private void button1_Click(object sender, EventArgs e)
        {
            mySecond("form3에서 텍스트 전송");
        }
    }
}

 

 

실행결과

 

Form2의 button1 클릭시

 

 

Form3의 button1 클릭시

 

'C# Programming > C#' 카테고리의 다른 글

[C#] 디버깅 하는방법  (0) 2024.05.15
[C#] Timer  (0) 2024.05.15
[C#] 비동기 프로그래밍  (0) 2024.05.15
[C#] 멀티스레드  (0) 2024.05.14
[C#] 데이터 베이스 연결 및 기본 CRUD  (1) 2024.05.14