728x90

C# 에서 폼간에 데이터를 전송한다는 의미를 정리해두려고 한다.

몇번의 수정을 하고 나서 이제는 거의 완벽하게 이해가 된 자료로 정리가 된 거 같다.

물론 실습으로 코딩을 하면서 막히면 자료를 보고 또 보면서 이 Properties 는 막힘없이 사용할 수 있게 되었다.


먼저 https://www.youtube.com/watch?v=PI3ad-TebP0

이 유투브 동영상을 보면 폼간에 데이터 전송하는 것이 나온다.


먼저 Form1 과 Form2 를 생성하고 UI를 작성해보자.


 


이제 F7키를 눌러서 코드를 살펴보자.



같은 Namespace 인데 class 이름은 Form1 과 Form2 로 서로 다르다.

C# 에서는 클래스가 다르면 원칙적으로 데이터에 접근할 수가 없다.

어느 클래스에서든지 접근이 가능하게 하려면 public 을 앞에 붙여줘야 한다.


속성(Properties)는 클래스의 인스턴스나 클래스 안의 데이터를 나타내는 하나의 멤버이다.

속성을 선언하는 형식은

데이터타입 속성이름

{

    get { return this.변수; }

    set { this.변수 = value; }

}


먼저, Form1 에서 Form2 를 호출하기 위한 코드

private void button1_Click(object sender, EventArgs e)
// Form1 에서 Form2 로 값을 전달하기 위한 이벤트 생성   
    Form2 frm2 = new Form2(); // Form2형 frm2 인스턴스화(객체 생성)
    frm2.ShowDialog();
}


이 코드는 Form2 창만 띄우는 것만 가능하지, 값을 전달하는 코드는 없다.

Form1의 textBox1 에서 입력한 값을 Form2 로 전달한다는 것은

Form2 에서 Form1의 값을 받아야 한다는 의미이다.



=== Form2 코드 ===

private string Form2_value;
public string Passvalue
{
    get { return this.Form2_value; }
    set { this.Form2_value = value; }  // 다른폼(Form1)에서 전달받은 값을 쓰기
}

private void Form2_Load(object sender, EventArgs e)
{
    textBox1.Text =
Passvalue; // 다른폼(Form1)에서 전달받은 값을 변수에 저장
}


=== Form1 코드 ===

private void button1_Click(object sender, EventArgs e)
{   // Form1 에서 Form2 로 값을 전달하기 위한 이벤트 생성
    if (textBox1.Text.Length == 0)
    {
         MessageBox.Show("값이 입력되지 않았습니다");
         return;
    }

    Form2 frm2 = new Form2(); // Form2형 frm2 인스턴스화(객체 생성)
    frm2.Passvalue = textBox1.Text;  // 전달자(Passvalue)를 통해서 Form2 로 전달
    frm2.ShowDialog();
}




이제 Form2 에서 입력한 값을 Form1 으로 전달하기 위한 코드를 추가해보자.

=== Form2 코드 ===

private string Form2_value;
public string Passvalue
{
    get { return this.Form2_value; } // Form2에서 얻은(get) 값을 다른폼(Form1)으로 전달 목적
    set { this.Form2_value = value; }  // 다른폼(Form1)에서 전달받은 값을 쓰기
}

private void button1_Click(object sender, EventArgs e)
{

    if (textBox2.Text == string.Empty)
    {
        MessageBox.Show("textBox2에 값이 입력되지 않았습니다");
        return;
    }

    Passvalue = textBox2.Text; // Form1 으로 값을 전달하기 위해
    this.Hide();
}


=== Form1 코드 ===

private void button1_Click(object sender, EventArgs e)
{   // Form1 에서 Form2 로 값을 전달하기 위한 이벤트 생성

    if (textBox1.Text.Length == 0)
    {
         MessageBox.Show("값이 입력되지 않았습니다");
         return;
    }

    Form2 frm2 = new Form2(); // Form2형 frm2 인스턴스화(객체 생성)
    frm2.Passvalue = textBox1.Text; // 전달자(Passvalue)를 통해서 Form2 로 전달
    frm2.ShowDialog();

    textBox2.Text = frm2.Passvalue; // 전달자(Passvalue)를 통해서 전달받은 값
}


테스트를 해보니 이런 방식은

Form2 를 띄우고 닫으면서 값을 전달하는 방식인거 같다.

frm2.ShowDialog(); 대신에 frm2.Show(); 로 대체하고 테스트를 해보니까

Form1 으로 다시 값이 반환되지 않는다.


아래는 테스트에 사용된 소스코드이다.


Properties.zip





기존의 속성 선언시 static 키워드를 붙여주면 어떤 변화가 생길까?

클래스의 인스턴스를  생성할 필요없이 직접 접근이 가능해진다.

정적(static)필드로는 모든 클래스의 인스턴스에 의해 공유된다는 점이 가장 큰 차이점이다.

정적 변수는 오직 하나만 존재한다.

인스턴스 변수(비정적 변수)는 인스턴스화(메모리를 할당)할 때마다 생성된다.


this.Form2_value 를 사용할 수 없게 에러가 표시된다. 즉, this 인 Form2 에서만 사용되는 범주를 벗어난다

=== Form2 코드 ===

private static string Form2_value;
public static string Passvalue
{
    get { return Form2_value; } // Form2에서 얻은(get) 값을 다른폼(Form1)으로 전달 목적
    set { Form2_value = value; }  // 다른폼(Form1)에서 전달받은 값을 쓰기
}


에러가 생기는 부분을 수정해줘야 한다.

객체 생성에 영향을 받지 않으므로 frm2 대신에 Form2 로 수정해준다.


=== Form1 코드 ===

private void button1_Click(object sender, EventArgs e)
{

    if (textBox1.Text.Length == 0)
    {
         MessageBox.Show("값이 입력되지 않았습니다");
         return;
    }
   

    Form2 frm2 = new Form2(); // Form2형 frm2 인스턴스화(객체 생성)
    Form2.Passvalue = textBox1.Text; // 전달자(Passvalue)를 통해서 Form2 로 전달
    frm2.ShowDialog();

    textBox2.Text = Form2.Passvalue; // 전달자(Passvalue)를 통해서 전달받은 값
}




그런데

private static string Form2_value;
public static string Passvalue
{
    get { return Form2_value; } // Form2에서 얻은(get) 값을 다른폼(Form1)으로 전달 목적
    set { Form2_value = value; }  // 다른폼(Form1)에서 전달받은 값을 쓰기
}

위 코드를

public static string Passvalue { get; set; }

* 참조 : prop 을 치고 + tab키를 누르면 자동으로 코드가 만들어진다.


한줄로 변경하면 어떤 변화가 생길까?

코드도 간단해지만, Passvalue 는 전달자 역할만 하면서 어떤 값을 대입할지 고민하지 않아도 된다.


=== Form2 코드 ===

public static string Passvalue { get; set; }  // 자동 구현 Properties
private void Form2_Load(object sender, EventArgs e)
{
    textBox1.Text = Passvalue; // 다른폼(Form1)에서 전달받은 값을 변수에 저장
}

private void button1_Click(object sender, EventArgs e)
{
    Passvalue = textBox2.Text; // Form1 으로 값을 전달하기 위해
    this.Hide();
}


=== Form1 코드 ===

private void button1_Click(object sender, EventArgs e)
{
    Form2 frm2 = new Form2(); // Form2형 frm2 인스턴스화(객체 생성)
    Form2.Passvalue = textBox1.Text; // 전달자(Passvalue)를 통해서 Form2 로 전달
    frm2.ShowDialog();

    textBox2.Text = Form2.Passvalue; // 전달자(Passvalue)를 통해서 Form2 값을 받음
}


Properties2.zip


static 을 추가하지 않으면 Form2 객체 생성을 통해서 값이 전달된다는 차이점만 있다.


결론은 전달받을 Form 에 Properties 를 추가한다는 것만 기억하자...





공통으로 사용할 것이라면 별도의 클래스를 따로 만들어서 Properties 를 추가하는 게 좋다.

prop 를 누르고 탭탭을 누르면 Properties 가 자동으로 완성시킬 수 있는 형태가 나온다.



블로그 이미지

Link2Me

,