본문 바로가기

취미생활/C#

[C#]Winform 모든 컨트롤 정보 가져오기

반응형

안녕하세요

 

코딩하는남자 코딩연습생입니다

 

이번에 할려고 하는것은 Winform에서 폼내의 모든 컨트롤의 이름을 가져올려고 합니다

 

보통 컨트롤 이름 가져오기 할께 사용하는 코드로는

 

Control GetControlByName(string Name)
{
    foreach (Control c in this.Controls)
        if (c.Name == Name)
            return c;

    return null;
}

이런식으로 구현을 하는데 이렇게 하게 되면

 

컨테이너컨트롤에 한해서 한 컨터이너컨트롤 내부의 컨트롤들만 불러오게 되더라구요

 

여기서 컨테이너컨트롤이라는건 Panle, groupbox, TableLayoutPanel, 등을 말하는것으로써

 

컨트롤을 감싸는 컨트롤을 칭하는것입니다

 

컨테이너 컨트롤을 포함한 모든 컨트롤을 불러오는 방법을 설명할 것입니다

 

클래스 파일을 생성합니다

 

 

[Source Code]

         public static Control[] GetAllControlsUsingRecursive(Control containerControl)
        {
            List<Control> allControls = new List<Control>();

            foreach (Control control in containerControl.Controls)
            {
                allControls.Add(control);

                if (control.Controls.Count > 0)
                {
                    allControls.AddRange(GetAllControlsUsingRecursive(control));
                }
            }

            return allControls.ToArray();
        }

 

이렇게 클래스 구문을 작성해주고

 

본문에서 다음과 같이 호출하여 리턴 받을 수 있습니다

 

[Source Code]

            Control[] controls = MyApp.GetAllControlsUsingRecursive(this);

            foreach (Control control in controls)
            {
                if (control.Name != "")
                {
                    if (control.Name.Substring(0, 3) == "lbl" || control.Name.Substring(0, 3) == "cmd")
                    {
                        control.Text = appResourceMgr.GetString(control.Name);
                    }
                }
            }

 

저의 경우네는 레이블과 버튼의 정보만 가져오고 싶어서

 

레이블의 명칭의 시작을 lbl로 구성하고 버튼의 시작 명칭을 cmd로 구성하였기에

 

IF문을 통해 해달 컨트롤을 걸러냈습니다

 

이렇게 하면 본문의 호출할려는 폼의 모든 컨트롤을 GetAllControlsUsingRecursive로 리턴해주고

 

GetAllControlsUsingRecursive에서는 재귀호출을 사용하여 컨테이너컨트롤 내부의 컨트롤 까지 검색하여

 

리턴해주게 됩니다

 

컨트롤 검색이나 명칭변경 또는 컨트롤 제어를 위해 고민중이시라면

 

다음과 같은 구문을 사용하여 검색하게 되면 좋을거 같습니다

 

감사합니다

반응형