질문에서 가끔 "자식폼에서 하는걸 부모폼이 받고 싶어요.." 라는 식의 질문이 올라오곤 하는데요.
방법은 여러가지가 있습니다.
자식폼에서 넘겨줄 데이터를 Public으로 선언한다거나, 프로퍼티로 설정한다거나...
전부 가능하지만... OOP가 지향하는 방향이랑 어긋나는 부분이라...
C#에서는 대리지와 이벤트를 제공합니다.(자바에서 지원하는 옵져버같이)
하나씩 하나씩 설명할께요. 처음엔 어렵지만 익숙해지면 매우 편리한 기능이니까요.
윈폼 프로젝트를 하나 새로 엽니다.
그럼 Form1이 등록되어 있는 프로젝트가 만들어지죠?
오른쪽 솔루션 탐색기에서 WindowsApplicationX에 마우스 오른쪽 클릭하시고
추가 -> Winform 하셔서 윈폼클래스를 하나 더 만듭니다.
(저는 만드니까 Form2가 되었습니다. 여러분들도 마찬가지 일꺼에요.)
Form1과 Form2에 동일한 작업을 합니다.. 어떤 작업이냐하면.
TextBox, Button을 하나씩 추가합니다.(이름은 귀찮으니까 그냥 두셔도 되고, 아름답게 지어주셔도 되고요.)
일단 Form2.cs를 여시고 아래와 같이 작성합니다.
// 제일 중요!!!!
public delegate void TextEventHandler(string text); // string을 반환값으로 같는 대리자를 선언합니다.
public event TextEventHandler WriteTextEvent; // 대리자 타입의 이벤트 처리기를 설정합니다.
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
WriteTextEvent(textBox1.Text); // 스트링값을 구독자(Form1을 지칭)에게 날려줍니다.
this.Close();
}
뭐하는지 모르시겠다구요? 그럼 Form1까지 보시면 감이 잡히실지도.. ;;
public Form1()
{
InitializeComponent();
}
// button1을 클릭하면...
private void button1_Click(object sender, EventArgs e)
{
// 자식 폼을 생성후...
Form2 frm2 = new Form2();
// 자식 폼이 가지고 있는 WriteTextEvent 라는 이벤트처리기에 frm2_WriteTextEvent라는 이벤트를 연결합니다.
// frm2.WriteTextEvent += 까지 치시면 tab 누리시면 자동생성 된다고 나오니까 tab 누르세요.
frm2.WriteTextEvent += new Form2.TextEventHandler(frm2_WriteTextEvent);
frm2.ShowDialog();
}
// tab눌러서 만들어진 코드에..
void frm2_WriteTextEvent(string text)
{
// 아래 문장을 적어줍니다. Form2에서 날라온 text를 부모폼(Form1)의 textBox1에 전달합니다.
this.textBox1.Text = text;
}
}
이쯤 하면 대충 감잡으시겠죠? 요약하면
1. 값을 전달할 부분에(주제) 대리자와 이벤트 처리기를 선언
2. 전달할 값을 세팅해준다.(WriteTextEvent(textBox1.Text); <--- 이 문장)
3. 값을 받을 부분(구독자)에 += 로 연결(구독)한다. (frm2.WriteTextEvent += new Form2.TextEventHandler(frm2_WriteTextEvent); <--- 이 문장)
4. 적당한 처리를 한다. (void frm2_WriteTextEvent(string text) <--- 이 문장)
꼭 스트링만 되는게 아니고 다른 타입도 되니... 이것저것 해보시면서 익히길 바랍니다.
출처 : http://paranbaram.springnote.com/pages/1223752
'프로그래밍 > C#' 카테고리의 다른 글
효과적인 C# 메모리 관리 기법 (0) | 2013.01.10 |
---|---|
쓰레드 기본 개념 (0) | 2009.10.29 |
C# 한글처리 (0) | 2009.10.29 |
C# 소켓 통신 예제 (0) | 2009.10.28 |