0 진짜 간단한 방식
폼 자체를 static으로 선언해서 다른 클래스에서 가져다 쓸 수 있게 하는 방법
구분 | F1 | F2 |
전역변수 | public static F1 f; public static int i; |
public static F2 f; public static int i; |
폼 로드 이벤트 | f = this; | f = this; |
폼1의 버튼 클릭 이벤트 폼1▶폼2 | F2.f.Set_Text((i++).ToString()); | |
폼2의 버튼 클릭 이벤트 폼1◀폼2 | F1.f.Set_Text((i++).ToString()); | |
보조 함수 | public void Set_Text(String a) { this.Text = a; this.Refresh(); } |
public void Set_Text(String a) { this.Text = a; this.Refresh(); } |
■ 참고 : 간단하지만 F2를 종료 했다가 다시 키면 F2 안의 값들이 리셋 될 수 있다. static 변수를 사용하면 남아있지만 남용하면 문제가 될 듯 ■ 응용 : 폼2가 항상 켜져 있는 상황에 유용 |
F1 | F2 |
public static F1 f; public F1() { InitializeComponent(); f = this; } private void F2_Send_Click(object sender, EventArgs e) { F2.f.Set_Text((i++).ToString()); } |
public static F2 f; public F2() { InitializeComponent(); f = this; } private void F1_Send_Click(object sender, EventArgs e) { F1.f.Set_Text((i++).ToString()); } |
1 Show 방식 + 이벤트 핸들러 델리게이트 + 클래스 객체 변수 조합
하나의 폼에서 작업을 할 때 다른 폼에도 동시에 이벤트를 전달하는 방식이다.개인적으로 선호하는 방식. 자료도 제일 많다.
구분 | F1 | F2 |
전역변수 | private readonly F2 f2 = new F2(); private int i; |
public delegate void Hello(String tmp); public event Hello Hi; int i; |
폼 로드 이벤트 | f2.Hi+= new F2.Hello(Wait_F2_Hi); | |
폼1의 폼2 열기 버튼 클릭 이벤트 | f2.Show(); | |
폼1의 버튼 클릭 이벤트 폼1▶폼2 | f2.Show_F2((i++).ToString()); | |
폼2의 버튼 클릭 이벤트 폼1◀폼2 | Hi("F1으로 보내기" + (i++).ToString()); | |
보조 함수 | private void Wait_F2_Hi(String tmp) { this.Text = tmp; } |
public void Show_F2(String tmp) { this.Text = tmp; } |
■ 참고 : Wait_F2_Hi는 F1 폼 로드시 한 번만 호출 해도 버튼을 누를 때 마다 다른 메세지를 F2에 전달 할 수 있다. F2에서 Hi라는 이벤트가 발생 할 때를 기다리는 함수가 F1에 있다는 것을 F2에게 알려 주는 핸들러를 다는 것이다. 좀 쉽게 예를 들자면 우리집에 니 전화를 기다리는 함수가 있어요. 라는 뜻이다. F2가 전화 올 때까지 기다릴게요. F2에서 Hi라는 이벤트를 발생시켜주면 F1에 있는 함수가 작동 된다. 분명 내 안에 있는 함수이지만 니가 불러주기 전까지는 쓰이지 않는 함수인 셈이다. Show_F2는 쉽다. 일반적인 클래스 변수를 선언해서 함수를 호출하는 것 처럼 쓰면 된다. ■ 응용 : 다양하게 활용이 가능한 방식이지만 나는 주로 디버그 박스에 로그를 찍을 때 많이 쓴다. Form 하나에 디버그 박스까지 넣어 놓고 visible을 바꾸는 방법도 있겠지만 개인적으로는 이 방식을 선호한다. |
F1 | F2 |
private readonly F2 f2 = new F2(); private int i; private void F1_Load(object sender, EventArgs e) { f2.Hi+= new F2.Hello(Wait_F2_Hi); } private void Btn_OpenF2_Click(object sender, EventArgs e) { f2.Show(); } privaet void Btn_SendF2_Click(object sender, EventArgs e) { f2.Show_F2((i++).ToString()); } private void Wait_F2_Hi(String tmp) { this.Text = tmp; } |
public delegate void Hello(String tmp); public event Hello Hi; int i; private void Btn_Test_Click(object sender, EventArgs e) { Hi("F1으로 보내기" + (i++).ToString()); } public void Show_F2(String tmp) { this.Text = tmp; } |
2 다이얼로그 방식 + GetSet + 클래스 객체 변수 조합
Form2를 열어서 뭔가를 처리하고, 닫을 때 처리 결과를 Form1에 되돌려 주는 방식.
말 그대로 Form2를 다이얼로그로 이용 하는 방식.
구분 | F1 | F2 |
전역변수 | readonly F2 f2 = new F2(); | private String tmp; |
get - set | X | public String GetSet { get{return tmp;} set{tmp = value;} } |
폼 로드 이벤트 | X | this.Text = GetSet; |
폼1의 버튼 클릭 이벤트 폼1▶폼2 | f2.GetSet = "폼2로 보낼문자열"; f2.ShowDialog(); |
X |
폼2의 버튼 클릭 이벤트 폼1◀폼2 | this.Text = f2.GetSet; | GetSet = "폼1으로 보낼 문자열"; |
■ 참고 : this.Text = f2.GetSet;는 f2.ShowDialog(); 바로 밑에 작성하면 된다. ShowDialog()함수는 Form2를 연 후 Form1의 조작이 불가능하다. Form2 창을 닫아 주어야 ShowDialog() 함수 아래 코드가 동작하기 시작한다. ■ 응용 : 나는 개인적으로 이미지 리스트를 더블클릭하면 새창에 원본 크기가 펼쳐지도록 사용을 하는 편 여러 이미지를 열어서 비교 하고 싶다면 f2.ShowDialog(); 대신에 f2.Show();를 사용하면 된다. 단, 이 경우 Form2에서 Form1으로의 전달은 할 수 없다. |
F1 | F2 |
readonly private F2 f2 = F2(); private int i; private void Btn1_Click(object sender, EventArgs e) { f2.GetSet = (i++)ToString(); f2.ShowDialog(); // F2가 Close되어야 다음 코드 실행 됨 this.Text = f2.GetSet; } |
private String tmp; private int i; public String GetSet { get { return tmp; } set { tmp = value; } } private void FC_Load(object sender, EventArgs e) { this.Text = GetSet; } private void Btn2_Click(object sender, EventArgs e) { GetSet = "F2 닫을 때 F1에 표시" + (i++).ToString(); } |
3 다이얼로그 방식 + 이벤트 핸들러 + 클래스 객체 변수 조합
다이얼로그 방식 역시 이벤트 핸들러와 함께 쓸 수 있다. 위의 1번과 2번 방식을 조합한 방식인데, 단방향으로만 쓴다.
구분 | F1 | F2 |
전역변수 | public String str = ""; | |
폼 로드시 이벤트 | this.Shown += ZoomForm_Shown; | |
폼1의 버튼 클릭 이벤트 폼1▶폼2 | F2 f2 = new F2(); f2.str="텍스트"; f2.ShowDialog(); |
|
폼2의 폼 로드 이벤트 폼1◀폼2 | this.Text = str; |
■ 참고 : 복잡하지 않기 때문에 간단하게 테스트 해 볼 때 쓰는 방식이다. 굳이 양방향 통신이 필요 없을 시 쓰면 된다. ■ 응용 : 이미지 확대 기능에 써봤다. |
F1 | F2 |
private void PBox_DoubleClick(object sender, EventArgs e) { F2_ImgZoom frm = new F2_ImgZoom { img="배경화면.jpg"; }; frm.ShowDialog(); } |
public String file = ""; public Image img; public F2_ImgZoom() { InitializeComponent(); this.Shown += ZoomForm_Shown; } private void ZoomForm_Shown(object sender, EventArgs e) { picturebox1.Image=img; } |
'etc > 프로그래밍' 카테고리의 다른 글
기본 RCW에서 분리된 COM 개체는 사용할 수 없습니다. (0) | 2021.06.18 |
---|---|
20210606 코딩 일지 (0) | 2021.06.06 |
C# 화면의 해상도를 가져 오는 코드 (0) | 2021.01.26 |
윈도우 10 - 방화벽에서 특정 아이피만 허용 (0) | 2020.11.30 |
SMTP 설정 (0) | 2020.11.27 |
댓글