본문 바로가기
etc/프로그래밍

[C#][Form] 폼간 데이터 전달 방식 정리

by 칸타렌서 2021. 4. 8.

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

 

 

 

 

 

 

 

 

 

댓글