본문 바로가기
application.hack

C# 폼간 데이터 전송 방법 정리

by 조브 2021. 3. 12.

C#에서 폼에서 폼으로 데이터를 전송(전달)하는 방법에 대해서 정리해 봅니다.

 

 

 

 

하나의 폼에서 데이터를 다른 폼으로 전달하는 방법에는 여러 가지가 있겠지만, 대략 아래의 방법들이 있습니다.

 

1. static 변수를 이용한 방법

 

2. 생성자를 이용한 방법

 

3. 메서드를 이용한 방법

 

4. 이벤트를 이용한 방법

 

 

1번과 2번 방법은 제한적이고 한계가 있기 때문에 시간이 없으신 분들은

3번과 4번 방법에 대해서만 보시면 됩니다.

 

 


 

1. static 변수를 이용한 방법

 

 

우선 첫 번째로 static 변수를 이용한 방법은 아래와 같이 Form2에서 static 변수를 생성하고 Form1에서 직접 접근하는 방법입니다.

 

Form2(데이터를 받는 폼)에서 static 변수를 생성

public partial class Form2 : Form
{
    ...
    
    //Form2에서 static 변수 생성
    static public string form1Text;
    
    ...
}


 

Form1(데이터를 보내는 폼)에서 Form2의 변수를 직접 참조

public partial class Form1 : Form
{
    ...
    //Form1에서 Form2의 form1Text변수에 직접 접근
    Form2.form1Text = "전달할 메세지";
    
    ...
}

 

간단한 방법이지만 썩 좋은 방법은 아닙니다.  전달한 데이터를 라벨이라 텍스트박스 등의 컨트롤에 바로 표시하려면 해당 컨트롤을 static으로 선언해야 합니다.

 

 

 


 

2. 생성자를 이용한 방법

 

 

생성자를 이용하여 폼 생성시 데이터를 전송하는 방법은 Form1에서 Form2를 생성할 때 데이터로 같이 보내는 방법이다. 폼을 생성할 때에 한해(일회성), Form1에서 Form2로 일방적으로 데이터를 전송할 수 있다.

 

Form2(데이터를 받는 폼) 에서 아래와 같은 생성자를 만들어 준다.

 public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
    
    public Form2(string data)
    {
        InitializeComponent();
        
        richTextBox_Form2_Receive.Text = data;
    }
}

 

Form1(데이터를 보내는 폼)에서 Form2를 생성할 때, 보내고자 하는 데이터도 같이 보낸다.

 

public partial class Form1 : Form
{
    ...
    
    //생성자를 통한 form2로 데이터 보내기
    Form2 form2 = new Form2("전달하려는 메세지");
    form2.Show();
    
    ...
}

 

 


 

3. 메서드를 이용한 방법

 

 

메서드를 이용한 방법으로 Form1에서 Form2로 데이터를 전달하는 방법입니다. 하나씩 보시면 어렵지 않습니다.

 

Form2(데이터를 받는 폼)에서 아래와 같은 메서드를 만들어 준다. (전달받은 데이터를 텍스트박스에 뿌려줌)

public partial class Form2 : Form
{
    
    public void SetText(string data)
    {
        richTextBox_Form2_Receive.Text = data;
    }
}
        
        

 

 

Form1(데이터를 보내는 폼)에서 Form2를 생성하고 Form2의 메서드를 호출하여 데이터를 전달한다.

public partial class Form1 : Form
{
    ...
    
    //생성자를 통한 form2로 데이터 보내기
    Form2 form2 = new Form2();
    form2.Show();
     
    //메서드를 이용한 form2로 데이터 전송
    form2.SetText("전달할 메세지");
    
    ...
}

 

 

 

그럼 메서드를 이용하여 Form2에서 Form1로 데이터를 보내려면 어떻게 해야 하는가?

 

이 때는 앞서 이야기한 생성자를 이용해야 합니다.

 

우선 Form1에도 아래와 같은 메서드를 만듭니다. (받은 데이터를 TextBox에 뿌려줍니다)

public partial class Form1 : Form
{
    ...
    
    public void SetText(string data)
    {
        richTextBox_Form1_Receive.Text = data;
    }
    
    ...
    
}

 

 

다음으로 Form2에 아래와 같은 생성자를 만들어 줍니다.

public partial class Form2 : Form
{
    Form1 form1;    

    public Form2(Form1 form)
    {
        InitializeComponent();

        form1 = form;
    }
}

 

다음으로 Form1에서 Form2 생성 시 앞서 생성한 생성자를 이용하여 Form1을 보냅니다.

public partial class Form1 : Form
{
    ...
    
    //생성자를 통한 Form1 자신 보내기
    Form2 form2 = new Form2(this);
    form2.Show();    
    ...
}

 

데이터를 보내기 위해 Form2에서 아래와 같이 Form1의 메서드를 이용합니다.

public partial class Form2 : Form
{
    Form1 form1;
    
    
    public Form2(Form1 form)
    {
        InitializeComponent();

        form1 = form;
    }

    private void button_Form2_Click(object sender, EventArgs e)
    {
        form1.SetText(richTextBox_Form2_Send.Text);
    }

}

 

결과를 살펴보면 Form1에서 아래와 같이 입력 후에, 버튼을 클릭하면, 

 

 

다음과 같이 Form2가 생성되며, Form1에서 보낸 데이터가 전송되었음을 알 수 있습니다. 다시 Form2에서 보낼 데이터를 입력하고 버튼을 클릭하면

 

 

Form2에서 보낸 데이터가 Form1에 잘 표시되는 것을 확인할 수 있습니다. 

 

 

복잡해 보이지만 전체 코드를 보시면 간단합니다.

메서드를 이용한 양방향 데이터 전달방법의 프로젝트 파일을 첨부합니다.

 

PassDataBetweenForms_method.zip
0.05MB

 

 

 

 

 

4. 이벤트를 이용한 방법

 

 

Form2에서 Form1로 이벤트를 이용하여 데이터를 보내는 방법은 아래와 같습니다.

 

 

Form2(데이터를 보내려는 폼)에 아래와 같이 delegate와 event 키워드를 이용하여 이벤트를 생성해 줍니다.

public partial class Form2 : Form
{
    //델리게이트
    public delegate void DataPassEventHandler(string data);

    //이벤트 생성
    public event DataPassEventHandler DataPassEvent;

    ...
}

 

 

Form1(데이터를 받는 폼)에서 Form2를 생성 시 앞서 만든 이벤트를 등록해 줍니다. 이때 데이터를 전달받는 이벤트 발생 시 처리할 함수도 같이 생성해 줍니다. DataRecevieEvent함수로 전달받은 데이터를 텍스트박스에 뿌려줍니다.

 

public partial class Form1 : Form
{
    
    ...
    
    private void button_Form1_Click(object sender, EventArgs e)
    {        
        Form2 form2 = new Form2();
        //데이터 전송 이벤트 등록
        form2.DataPassEvent += new Form2.DataPassEventHandler(DataRecevieEvent);
        form2.Show();        
    }
    
    //form2로 부터 Data를 받아와서 처리하는 부분
    private void DataRecevieEvent(string data)
    {
        richTextBox_Form1_Receive.Text = data;
    }
}

 

Form2에서 버튼 클릭 시 이벤트를 호출하여 입력된 데이터를 전송해줍니다.

 

public partial class Form2 : Form
{
    ...
    
    private void button_Form2_Click(object sender, EventArgs e)
    {
        //이벤트 호출
        DataPassEvent(richTextBox_Form2_Send.Text);
    }
    
    ...
}

 

 

실행 결과는 3. 메서드를 이용한 방법과 동일하여 생략합니다.

 

 

전체 소스코드 확인을 위해

 

Form1에서 Form2로 데이터를 보낼 때는 생성자와 메서드로 보내고

Form2에서 Form1로 데이터를 보낼 때만 이벤트를 이용한 프로젝트 파일을 첨부합니다.

 

 

PassDataBetweenForms_event.zip
0.05MB

 

 

 


 

 

그럼 Form1에서 Form2로 이벤트를 이용하여 양방향으로 데이터를 보내려면 어떻게 할까요?

마찬가지로 생성자를 이용하여 Form1의 인스턴스를 Form2로 전달하고 이벤트를 등록하여 줍니다.

 

앞서 설명한 Form1과 Form2가 바뀌는 것뿐 대칭이므로 따로 설명하진 않습니다.

 

 

 

 

 

 

이상으로 C#에서 폼끼리 데이터를 전송하는 방법에 대해서 알아보았습니다.

 

 

 

댓글