C# - WinForms 폼의 컨트롤을 다른 클래스에서 제어하는 방법

 

개요

WinForms로 구성된 C# 애플리케이션 프로젝트에서

폼의 컨트롤(예를 들면 텍스트 박스)을 다른 클래스 파일에서 제어하는 방법을 다룹니다.


Form 디자인

  • 텍스트 박스(컨트롤) 생성

 

  • 텍스트 박스 속성 변경
    • (Name) : 텍스트 박스 개체의 이름
    • Modifiers : 텍스트 박스 개체의 표시 수준
      • 기존 Private > 변경 Public
      • 메서드를 통한 제어에서는 필요 없으나 변수를 이용하여 제어할 경우 반드시 설정해야 한다.

 

  • 텍스트 내용 정의
    • Text : 'Hello World!' (사용자 임의 작성)

 

  • 셋팅된 폼 화면


다른 클래스에서 컨트롤 제어

기본 폼 설정

메인 (Form1.cs)

  • 폼을 다른 클래스에서 다루기 위해 아래의 두가지 코드를 정의해주어야 함
  • 즉,  폼을 인스턴스화하여 변수로 다루기 위함 
    • public static Form1 from;
    • form = this;
namespace classDataReceiverTest
{
    public partial class Form1 : Form
    {
    	// 폼을 제어하기 위해 public static 으로 선언
        public static Form1 form;
        public Form1()
        {
        	// 폼을 변수로 접근하기 위함
            form = this;
            InitializeComponent();
        }
    }
}

메서드를 통해 컨트롤 제어

메서드를 통해 컨트롤(포스팅에서는 텍스트 박스)을 제어하려면 절차는 다음과 같다.

  1. 메인 폼에서 컨트롤을 제어할 수 있도록 메서드 정의
    • 메서드는 get~ / set~로 대개 정의한다.
  2. 클래스에서 메인폼의 메서드를 이용하여 객체 제어
    • 메서드의 이름은 자유이지만 포스팅에서는 formGet~ / formSet~ 으로 사용한다.
  3. 메인 폼에서 클래스에서 제어한 객체의 메서드 호출

 

정리

textBox1의 내용 가져오기

> Form1에서 메서드 정의 : getText()

> 클래스에서 Form1 메서드 이용하여 개체 컨트롤 : formGetText()

> Form1에서 클래스에서 개체를 컨트롤한 메서드 재호출 : class.formGetText()


메인 (Form1.cs)

  • 객체를 다룰 메서드 정의
    • getText : TextBox의 내용을 읽어옴
    • setText : TextBox의 내용을 새로 지정
namespace classDataReceiverTest
{
    public partial class Form1 : Form
    {
    	// 폼을 제어하기 위해 public static 으로 선언
        public static Form1 form;
        public Form1()
        {
        	// 폼을 변수로 접근하기 위함
            form = this;
            InitializeComponent();
        }

		// TextBox의 메시지를 받아오기 위한 함수 정의
        public string getText()
        {
            return textBox1.Text;
        }

		// TextBox의 메세지를 지정하기 위한 함수 정의
        public void setText(string txt)
        {
            textBox1.Text = txt;
        }
    }
}

클래스(FormControllText.cs)

클래스에서 특정 개체의 메소드를 다루려면 결국은 호출하는 폼에서 다시 호출되어야 한다.

  • 특정 개체를 다루는 메서드를 호출하는 함수 정의
    • formGetText : 폼1의 텍스트 박스의 내용을 가져옴
    • formSetText : 폼1의 텍스트 박스의 내용을 새로 지정함
namespace classDataReceiverTest
{
    class FormControllTest
    {
    	// Form1에 정의된 텍스트박스의 내용을 가져오는 메소드 호출
        public void formGetText()
        {
            string txt = Form1.form.getText();
            MessageBox.Show(txt);
        }

		// Form1의 텍스트박스에 메시지를 지정하는 메소드 호출
        public void formSetText()
        {
            Form1.form.setText("have a nice day!");
        }
        
    }
}

메인 (Form1.cs)

폼 1개와 클래스 1개로만 구성된 단순한 프로젝트이므로 재호출을 하지만, 프로젝트 구성에 따라 다를 수 있다.

  • 클래스의 메서드를 재호출하기 위해 클래스 인스턴스화
    • 클래스이름 인스턴스명 = new 클래스이름();
  • 클래스에서 정의한 메소드 다시 호출
    • formGetText : 클래스에서 TextBox의 내용을 가져온 메소드 재호출
    • formSetText : 클래스에서 TextBox의 내용을 지정하는 메소드 재호출
namespace classDataReceiverTest
{
    public partial class Form1 : Form
    {
    	// 폼을 제어하기 위해 public static 으로 선언
        public static Form1 form;
        
        /* ### 추가된 코드 ### */
        // 클래스에서 제어한 메소드를 재호출하기 위해 클래스 인스턴스화
        FormControllTest test = new FormControllTest();
        
        public Form1()
        {
        	// 폼을 변수로 접근하기 위함
            form = this;
            InitializeComponent();
            
            /* ### 추가된 코드 ### */
            // 클래스에서 정의한 메소드 호출
            test.formGetText();
            test.formSetText();
        }

		// TextBox의 메시지를 받아오기 위한 함수 정의
        public string getText()
        {
            return textBox1.Text;
        }

		// TextBox의 메세지를 지정하기 위한 함수 정의
        public void setText(string txt)
        {
            textBox1.Text = txt;
        }
    }
}

실행

  • textBox1 > Form1.getText > Class.formGetText

 

  • textBox1 > Form1.setText > Class.formSetText


변수를 이용한 컨트롤 제어

메인 (Form1.cs)

  • Form1을 변수로 제어하기 때문에 따로 메서드 제정의는 필요 없다.
  • 다만 반드시 폼 디자인에서 컨트롤의 Modifiers를 Public으로 변경해주어야 한다.
namespace classDataReceiverTest
{
    public partial class Form1 : Form
    {
    	// 폼을 제어하기 위해 public static 으로 선언
        public static Form1 form;

        public Form1()
        {
        	// 폼을 변수로 접근하기 위함
            form = this;
            InitializeComponent();
        }
    }
}

클래스(FormControllText.cs)

메서드를 통할 경우 Form1에서 정의한 메서드를 호출하여 해당 지정된 개체만 컨트롤이 가능한 반면

변수를 이용하여 폼의 개체를 제어할 경우에는 제한된 개체에 한정되지 않고 자유롭게 개체 컨트롤이 가능하다.

 

  • Form1에서 지정한 form 개체 호출
    • Form1.form
  • Form1에 존재하는 개체 컨트롤
    • Form1.form.개체.개체메서드
namespace classDataReceiverTest
{
    class FormControllTest
    {
    	// 폼의 TextBox의 내용을 가져오는 메서드
        public void formGetText()
        {
            string txt = Form1.form.textBox1.Text;
            MessageBox.Show(txt);
        }

		// 폼의 TextBox의 내용을 새로 지정하는 메서드
        public void formSetText()
        {
            Form1.form.textBox1.Text = "have a nice day!";
        }
        
    }
}

메인 (Form1.cs)

  • 메인에서 클래스를 인스턴스화하고 클래스의 메서드를 호출
    • 클래스 인스턴스 생성
      • FormControllTest test = new FormControllTest();
    • 클래스 메서드 호출
      • test.formGetText / test.formSetText
namespace classDataReceiverTest
{
    public partial class Form1 : Form
    {
        FormControllTest test = new FormControllTest();
        public static Form1 form;
        public Form1()
        {
            form = this;
            InitializeComponent();

            test.formGetText();
            test.formSetText();
        }
    }

실행

  • textBox1 > (Form1) Class.formGetText

 

  • textBox1 > (Form1) Class.formSetText


참고