자식폼에서 메인폼으로 값을 전달하는 방법으로
public 을 선언하여 넘겨주는 방법만 사용했었는데 이번에 검색해서 좋은 정보를 알게되었다.
배운지도 얼마 안되고 독학을 하다보니 C# 기능을 제대로 몰라서 애로사항이 많다.
몇번 더 적용해보면 확실하게 내것이 될 수 있을 거 같다.
(작성일자 : 2015.11.29) -- delegate 를 제대로 이해하지 못한 상태에서 작성한 자료
목적1 : 자식폼(Form2) 에서 메인폼으로 데이터 전달
=== 자식폼에서 설정하는 것들 =====
public delegate void Form2_EventHandler(string data); // string 을 반환값으로 같은 대리자를 선언
public event Form2_EventHandler TextSendEvent; // 대리자 타입의 이벤트 처리기를 설정
// 클릭하여 실제 전달되는 값
TextSendEvent(dlgOpen.FileName.ToString()); // 스트링값을 메인폼에게 보내줌
=== 메인폼에서 설정하는 것들 ===
// 자식폼(Form2)를 띄우는 이벤트
private void pictureBoxOpen_Click(object sender, EventArgs e)
{
foreach (Form openForm in Application.OpenForms)
{
if (openForm.Name == "Form2") //폼 중복 열기 방지
{
openForm.Activate();
return;
}
}
Form2 frm2 = new Form2();
// 자식폼이 가지고 있는 TextSendEvent 이벤트 처리기에 frm2_getTextEvent 이벤트 연결
frm2.TextSendEvent += new Form2.Form2_EventHandler(frm2_getTextEvent);
frm2.Show(); // 자식폼이 활성화된 상태에서 값을 전달받기 위해서
}
void frm2_getTextEvent(string text)
{
// 값을 넘겨 받아서 실제 처리할 함수
CurrentData = text; // Form2 에서 넘겨받는 값
}
참고한 자료는 http://blog.naver.com/kjh258999/20043308380 이며, 테스트를 통해서 동작되는 걸 확인하면서 이름 변경을 해보면서 어떤 이름들이 변경되는지 확인하였다.
그래서 좀 더 이해가 되도록 이름을 변경했고, 색상으로 표시를 했다.
다른 블로그(http://notull.tistory.com/entry/C-%ED%8F%BC%EA%B0%84-%EA%B0%92%EC%A0%84%EB%8B%AC-Event%EB%B0%9C%EC%83%9D)에도 예제 비슷하게 되어 있는데 설명은 없다.
목적2 : 메인폼에서 자식폼으로 데이터를 전송하는 방법
=== 메인폼에서 설정하는 것들 ===
// 자식폼(Form2)를 띄우는 이벤트
private void pictureBoxOpen_Click(object sender, EventArgs e)
{
foreach (Form openForm in Application.OpenForms)
{
if (openForm.Name == "Form2") //폼 중복 열기 방지
{
openForm.Activate();
return;
}
}
Form2 frm2 = new Form2();
frm2.Owner = this; // 이 한줄을 추가해준다
// 자식폼이 가지고 있는 TextSendEvent 이벤트 처리기에 frm2_getTextEvent 이벤트 연결
frm2.TextSendEvent += new Form2.Form2_EventHandler(frm2_getTextEvent);
frm2.Show(); // 자식폼이 활성화된 상태에서 값을 전달받기 위해서
}
void frm2_getTextEvent(string text)
{
// 값을 넘겨 받아서 실제 처리할 함수
CurrentData = text; // Form2 에서 넘겨받는 값
}
=== 자식폼에서 설정하는 것들 =====
public delegate void Form2_EventHandler(string data); // string 을 반환값으로 같은 대리자를 선언
public event Form2_EventHandler TextSendEvent; // 대리자 타입의 이벤트 처리기를 설정
// 클릭하여 실제 전달되는 값
TextSendEvent(dlgOpen.FileName.ToString()); // 스트링값을 메인폼에게 보내줌
// 메인폼의 이름이 Form1 이라고 한다면
Form1 f1 = (Form1)this.Owner;
한줄을 추가해주고 나서, 값을 뿌릴 곳에다가 뿌려준다.
MessageBox.Show(f1.textBox1.Text);
textBox1 의 속성 중에서 Modifies 를 public 으로 반드시 변경해야 한다.
넘겨줄 값이 labelSubtitle1.Text 라서 아래 화면처럼 속성을 변경해줬다.
Form2 를 Load 하면서 메인폼의 값을 전달하는게 맞을거 같아서 Load 이벤트에 내용을 추가했다.
private void Form2_Load(object sender, EventArgs e)
{
MainForm f1 = (MainForm)this.Owner;
SearchBox.Text = System.IO.Path.GetFileNameWithoutExtension(f1.labelSubtitle1.Text);
// Modifiers 를 public 으로 설정해줘야 된다.
}
'C# > Layout 및 델리게이트' 카테고리의 다른 글
C# 로그인 ID 정보 저장 (Properties.Settings 이용) (3) | 2015.12.03 |
---|---|
C# 폼간 데이터 전송 : Properties(속성) get, set (완벽한 정리) (6) | 2015.11.30 |
C# 폼 데이터 받아서 처리 (폼 중복열기 방지) (0) | 2015.10.26 |
C# Panel 또는 TabPage 에 다른 폼 올리기 (0) | 2015.09.22 |
C# 폼 중복실행 방지, Show(), ShowDialog() (2) | 2015.09.20 |