개발/C#

C# 폼간에 전역변수 사용하기

FA1976 2017. 12. 14. 13:41

Form1와 Form2를 만들었거든요.

Form1에 값을 Form2에 넘겨서 Form2에 있는 다이얼로그박스에있는 버튼을 누르면 Form1에서 넘겨준

값을 뿌려주는 간단한 프로그램입니다.


Form2안에 get,set 코드를 심어주면 잘 되는데.그렇게 하지않구 Data.cs라는 클래스를 하나 만들어서

거기에 get_set을 넣었습니다.어떻게 호출하면 되는지요?

아래와같이 작성했는데 왜 값이 Form2에 안넘어가는지 모르겠네요.

 


/**********Form1.cs***********************/

private void button1_Click(object sender, EventArgs e) {                     

            Form2 Frm2 = new Form2();       

            Data a = new Data();

            a.Ct = "안녕하세요";          

            Frm2.ShowDialog();         

}

/***********************************************/

/************Form2.cs***************************/

  private void button1_Click(object sender, EventArgs e)  {

            Data Dt =new Data();          

            MessageBox.Show(Dt.Ct.ToString());          

        }

/************************************************/

/************Data.cs*******************************/

class Data

    {

        string caption;

        public string Ct

        {

            get

            {

                return caption;

            }

            set

            {

               caption = value;

            }

        }

    }

/***************************************************/


 


왜 그런지 답을 알려드릴게요.


/**********Form1.cs***********************/

private void button1_Click(object sender, EventArgs e)   {          

           

            Form2 Frm2 = new Form2();       

            Data a = new Data();

            a.Ct = "안녕하세요";          

            Frm2.ShowDialog();         

        }

/***********************************************/


Form1 클래스의 button1_Click 이벤트 핸들러에서 하는 작업은 다음과 같네요.

1) Form2 클래스의 인스턴스를 생성

2) Data 클래스의 인스턴스를 생성 후 초기화 작업

3) 생성된 Form2 클래스의 인스턴스를 화면에 출력. ShowDialog() 메소드 사용.


자~~ 여기서..


1) 2) 과정을 보면,

Form2 클래스의 인스턴스와 Data 클래스의 인스턴스는 아무런 연관 관계가 없다는 거죠.

관련점을 찾자면, 이벤트 핸들러의 지역 변수로 설정되었다는 거죠.

Form2 클래스의 인스턴스는  Data 클래스의 인스턴스의 참조를 갖고 있지 않으므로,

여기서 생성된 Data 클래스의 인스턴스에 절대로 접근할 수 없답니다.


즉, 지역변수로 인스턴스를 생성했든간에, 뭔가 클래스에 참조로 넘겨주든지 하는게 있어야 하는데,

그런게 없으니, 클래스의 인스턴스가 무슨 수로 지역 변수에 접근할 수 있겠냐구요?

지역변수를 소개시켜주지도 않았으니 알 턱이 없죠.


****************************************

예를 들어, 최소한 다음과 같은 코드는 있어야 겠죠.


            Form2 Frm2 = new Form2();       

            Data a = new Data();

            a.Ct = "안녕하세요";  

            frm2.CustomData = a;        // 뭐, 이렇게 설정하는게 있다면야, frm2 에서 CustomData        

                                                 // 프로퍼티로, 데이터를 전달받고 이를 출력할 수 있겠죠.

                                                 // 연관고리가 있어야 한다는 거죠.

            Frm2.ShowDialog();

 ****************************************


/************Form2.cs***************************/

  private void button1_Click(object sender, EventArgs e)   {

            Data Dt =new Data();          

            MessageBox.Show(Dt.Ct.ToString());

           }

/************************************************/


Form2 클래스의 button1_Click 이벤트 핸들러에서 하는 작업은 다음과 같네요.

1) Data 클래스의 인스턴스를 생성.

2) 이 인스턴스의 내용을 메시지 박스에 출력


자~~ 여기서..


1) 과정에서 생성한 인스턴스는 완전히 별도의 메모리 개체로써, Form1 클래스의 이벤트 핸들러에서

생성한 Data 개체와는 하나도 관련이 없죠.


무슨 말인지 아시겠죠? 


각각 Form1, Form2 클래스의 이벤트 핸들러에 있는 지역 변수일 뿐이란 말입니다.

이벤트 핸들러가 끝나면, 그냥 가비지 컬렉터로 이동되는 변수죠.

 


자~~ 해결책은 여러가지가 있는데, 매우 간단하게 방법을 알려드리죠.


Data 클래스를 매개로 Form1 과 Form2 를 연결하고 싶다고 했죠?

그러면, Data 클래스를 static 으로 만들어 볼 수도 있어요.

클래스를 static 으로 만들었으면, 그 내부에는 멤버도 모두 static 이 되어야 하죠.

이렇게 되면, 일종의 전역 변수 형태가 되죠.


Form1 클래스에서도 참조가능하고, Form2 클래스에서도 참조가능하죠.


static class Data

{

        static string caption;

        static public string Ct

        {

            get

            {

                  return caption;

            }

            set

            {

                 caption = value;

            }

       }


이제, 이벤트 핸들러를 고쳐봅시다.

/**********Form1.cs***********************/


private void button1_Click(object sender, EventArgs e)    {          

           

            Form2 Frm2 = new Form2();       

              // Data a = new Data();

              // a.Ct = "안녕하세요";          

            Data.Ct = "안녕하세요";

            Frm2.ShowDialog();         

       }

/***********************************************/


/************Form2.cs***************************/


  private void button1_Click(object sender, EventArgs e)   {

            //Data Dt =new Data();          

            MessageBox.Show(Data.Ct.ToString());

        }

/************************************************/



출처: http://cheesev.tistory.com/entry/C-전역변수-사용법-폼-간에 [SuperStar]

'개발 > C#' 카테고리의 다른 글

C# Intel hex to bin Code  (0) 2018.01.02
C# CRC32  (0) 2017.12.27
C#클래스 분리  (3) 2017.12.26
C#에서 dll import 하기  (0) 2017.12.14
디버깅 오류 - System.BadImageFormatException  (0) 2017.12.13
모달리스 다이얼로그  (0) 2017.12.13
모달 다이얼로그  (0) 2017.12.13
c# 쓰레드2  (0) 2017.12.07