본문 바로가기
프로그래밍 언어/C#

[C#] WinForm 의 모든 컨트롤 가져오기

by Jinwood 2022. 1. 7.
반응형

특정 Form Control 가져오려는 경우 Linq의 Cast<>를 사용하면 된다.

아래는 모든 컨트롤 정보를 리스트로 정의하는 코드이다.

 

1
2
3
// Control를 가져오려는 Form의 이름 : myForm
Form myForm;
List<Control> Control_List = myForm.Controls.Cast<Control>().ToList();
cs

 

TextBox, CheckBox 같은 특정 Control 요소만 필요한 경우, Linq Where 사용하여 필터링 할 있다.

 

1
2
3
4
5
6
7
// TextBox만 필터링
List<Control> Control_List = myForm.Controls.Cast<Control>().Where(p => p is TextBox).ToList();
 
 
// TextBox, CheckBox 필터링 : || 로 추가
List<Control> Control_List = myForm.Controls.Cast<Control>().Where(p => p is TextBox || p is CheckBox).ToList();
cs

 

코드에서 문제점은 GroupBox 내부에 있는 Control 들은 찾아내지 못한다 점이다.

따라서 아래의 코드처럼 모든 Control 가져오는 코드를 작성해야한다.

재귀 함수를 아래와 같은 메서드를 만든다.(Control 내의 모든 TextBox 가져오는 메서드이다.)

TextBox 뿐만 아니라 Control 요소 또한 필요한 경우 위에서 설명되었듯이 || 추가한다.

( Where(p => p is TextBox || p is RadioButton || p is CheckBox || p is ComboBox) )

 

1
2
3
4
5
6
7
// 모든 Control을 가져오기 위한 재귀함수 형태의 메서드
public IEnumerable<Control> Get_All_Controls(Control control)
{
    var controls = control.Controls.Cast<Control>();
 
    return controls.SelectMany(ctrl => Get_All_Controls(ctrl)).Concat(controls).Where(p => p is TextBox);
}
cs

 

메서드를 사용하여 모든 TextBox 컨트롤을 가져오려면 아래와 같이 사용하면 된다.

앞서 사용한 myForm 존재하는 모든 Control 찾아오려면 아래와 같이 작성한다.

입력 파라메터를 수정하여 가져오려는 Control 받고, 재귀함수에 Where 내부 조건을 정의해서 사용한다면 보다 범용적으로 사용 가능한 메서드가  것이.

1
List<Control> controlList = Get_All_Controls(myForm).ToList();
cs

 

반응형

댓글