C#

Winform 모든 컨트롤 조회하기

isaac.kim 2020. 12. 2. 10:23
728x90
반응형

Winform 모든 컨트롤 조회하기

 

1. 전체 Control 객체를 담을 변수를 선언한다. Control[] controls =

2. 모든 컨트롤을 조회하기 위한 함수를 정의한다. GetAllControlsRecursive

 - 모든 컨트롤을 담아서 반환하기 위해 반환형은 Control[]

 - Winform의 Control에 대해서 조회하기 위해 매개변수는 Control 타입으로 지정한다.

// 현재 Winform 최상단 부모 객체를 전체 조회할 함수에 인자(this)로 넣는다.
Control[] controls = GetAllControlsRecursive(this);

// 모든 컨트롤 조회하기 함수
public Control[] GetAllControlsRecursive(Control containerControl)
{
	// 중량
}

*부모 컨트롤에서 자식 컨트롤을 조회해 나가는 과정에서 Container (panel과 같은) 타입을 조회하고 나서는 조회를 멈춘다. 쉽게 말하면 자식 컨트롤을 바로 조회할 수는 있지만, 자식 컨트롤이 컨테이너 타입인 경우 그 하위에 있는 것들은 조회하지 않는다. (자식은 조회하고, 자손은 조회하지 않는다.)

 

따라서 Winform 위에 모든 컨트롤을 조회하는 함수는,

Container 타입을 조회하여도 그 하위에 있는 모든 컨트롤들을 조회할 수 있도록 재귀함수로 구현한다.

 

public Control[] GetAllControlsRecursive(Control containerControl)	// Main object부터 시작
{
	List<Control> controlList = new List<Control>();

	foreach (Control ctl in containerControl.Controls)	// 자식 컨트롤을 하나씩 조회하여
	{
		controlList.Add(ctl);	// list에 넣는다.
        
		if (ctl.Controls.Count > 0)	// 자식 컨트롤의 자식 컨트롤들이 0보다 많으면
		{	// Container 이므로
			controlList.AddRange(GetAllControlsRecursive(ctl)); // container를 재귀호출한다. 
            // 그리고 그 값들은 AddRange로 리스트에 추가된다.
		}
	}
	return controlList.ToArray(); // 콘트롤 리스트를 반환한다.
}

 

 

재귀 과정을 통해 모든 컨트롤을 조회할 수 있다.

 

 

728x90
반응형