반응형
개요
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();
}
}
}
메서드를 통해 컨트롤 제어
메서드를 통해 컨트롤(포스팅에서는 텍스트 박스)을 제어하려면 절차는 다음과 같다.
- 메인 폼에서 컨트롤을 제어할 수 있도록 메서드 정의
- 메서드는 get~ / set~로 대개 정의한다.
- 클래스에서 메인폼의 메서드를 이용하여 객체 제어
- 메서드의 이름은 자유이지만 포스팅에서는 formGet~ / formSet~ 으로 사용한다.
- 메인 폼에서 클래스에서 제어한 객체의 메서드 호출
정리
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
참고
반응형