반응형

* C# 컨트롤 이름으로 찾아 컨트롤 배열 처럼 사용 하기 예제...

 

메인화면

전체 소스코드

Form1.cs

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace CSharp_ControlArray
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

            //컨트롤 이름으로 찾아서 컨트롤 배열 처럼 사용 하기...
            //폼안에 컨트롤들 Panel 안에 있던 GroupBox 안에 있던 상관 없이 접근 가능
            
            for (int iCount = 1; iCount <= 10; iCount++)
            {
                this.FindByName<Button >("Button" + iCount.ToString()).Text = "Test" + iCount.ToString();
                this.FindByName<CheckBox>("CheckBox" + iCount.ToString()).Text = "Test" + iCount.ToString();
                this.FindByName<Label>("Label" + iCount.ToString()).Text = "Test" + iCount.ToString();
            }


            //아래의 소스코드 처럼 Panel 안에 있는 컨트롤들을 찾아서 Text 를 바꾸는 예제
            //계층적임.
            int iSample = 0;

            //각각 Panel GroupBox 안에 있는 컨트롤 접근
            //foreach (Control ct in panel1.Controls)
            //{
            //    CheckBox ch = ct as CheckBox;
            //    ch.Text = iSample.ToString();
            //    iSample += 1;
            //}

            //foreach (Control ct in groupBox1.Controls)
            //{
            //    Label lb = ct as Label;
            //    lb.Text = iSample.ToString();
            //    iSample += 1;
            //}

            //폼 안에 컨트롤 접근 -> Panel 및 GroupBox 찾아서 그 안에 있는 컨트롤 접근
            foreach (Control ct in this.Controls)
            {
                //타입이 Panel 이면...
                if (ct.GetType().Name.ToLower() == "panel")
                {
                    Panel pnl = ct as Panel;
                    foreach (Control ct1 in pnl.Controls)
                    {
                        CheckBox ch = ct1 as CheckBox;
                        ch.Text = iSample.ToString();
                        iSample += 1;
                    }
                }
                //타입이 GroupBox 이면...
                else if (ct.GetType().Name.ToLower() == "groupbox")
                {
                    GroupBox gb = ct as GroupBox;
                    foreach (Control ct2 in gb.Controls)
                    {
                        Label lb = ct2 as Label;
                        lb.Text = iSample.ToString();
                        iSample += 1;
                    }
                }
                
                //이 부분 어차피 접근이 안되는 부분... 
                else if (ct.GetType().Name.ToLower() == "label")
                {
                    Label lb = ct as Label;
                    lb.Text = "123213213213213";
                }

            }

        }
    }
}

 

 

 

Panel 이나 GroupBox 에 있는 컨트롤도 접근이 가능 한 이유는 Form1.Designer.cs 파일을 열어 보게 되면

아래의 그림과 같습니다.

 

System.Reflection.FieldInfo[] fis = obTarget.GetType().GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

=> 이 구문을 풀어서 설명 하면서 GroupBox 나 Panel 에 있는 컨트롤도 접근 가능 한 이유도 같이 설명 하겠습니다.

     //Object 클래스 객체 타입을 얻어 옴...

     Type tp = obTarget.GetType();

 

     //Object 클래스 객체 안의 Private 변수들을 FieldInfo 배열로 받아 오기

     //전달 인자로 Flags 값이 NonPublic 이면 Private 변수들만 Public 이면 Public 변수들만 얻어 오게 됨.

     // 여기서 위 그림과 같이 Form1 디자이너에 선언된 필드들(즉 Private 변수들)을 얻어 오게 됩니다. 

     System.Reflection.FieldInfo[] fis = tp.GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);

 

     //아래의 그림처럼 브레이크를 걸어 fis배열 변수를 확인 해 보면...

 

     //사용자가 찾을려는 변수 이름을 얻어 리턴 변수 객체...
     System.Reflection.FieldInfo fi = null;

 

    //찾을 컨트롤 이름과 대조 해서 
     for (int iIndex = 0; iIndex < fis.Length; iIndex++)

      {
            //맞다면...
            if (fis[iIndex].Name.ToLower() == strName.ToLower())
            {
                 fi = fis[iIndex];

                 //사용자가 찾을려는 변수 객체를 찾았으니 For문 빠져 나오기...
                 break;
            }
       }

 

* 예제 실행 결과

 

 

 

 

 

//폼 안에 컨트롤 접근 -> Panel 및 GroupBox 찾아서 그 안에 있는 컨트롤 접근
            foreach (Control ct in this.Controls)
            {
                //타입이 Panel 이면...
                if (ct.GetType().Name.ToLower() == "panel")
                {
                    Panel pnl = ct as Panel;
                    foreach (Control ct1 in pnl.Controls)
                    {
                        CheckBox ch = ct1 as CheckBox;
                        ch.Text = iSample.ToString();
                        iSample += 1;
                    }
                }
                //타입이 GroupBox 이면...
                else if (ct.GetType().Name.ToLower() == "groupbox")
                {
                    GroupBox gb = ct as GroupBox;
                    foreach (Control ct2 in gb.Controls)
                    {
                        Label lb = ct2 as Label;
                        lb.Text = iSample.ToString();
                        iSample += 1;
                    }
                }
                
                //이 부분 어차피 접근이 안되는 부분... 
                else if (ct.GetType().Name.ToLower() == "label")
                {
                    Label lb = ct as Label;
                    lb.Text = "123213213213213";
                }

            }

  위 구문 처럼... 계층적으로 접근

* Panel.Controls 나 this.Controls 로 찾는 방식이랑은 틀림

ex) Panel1 에 Label 1,2,3,4,5 가 있고 Pannel2 에 Label 6,7,8,9 가 있음

   Panel1.Controls 로 Label12345 를 찾고 Panel2.Controls 로 6789 를 찾아야 됨.



 

https://kdsoft-zeros.tistory.com/10

 

[VBNET] 컨트롤 배열처럼 사용 하기(Controls Arrary)

VB6 처럼 VBNET 도 컨트롤 배열처럼 사용 하기 VB6 은 컨트롤 배열작성시 인덱스 가 정수형으로 사용 Label(1) Label(2) Label(3) Label(4) Label(5) Label(6)~ for iCount to 6 Label(iCount).Text ="" Next 하지..

kdsoft-zeros.tistory.com

 

반응형

+ Recent posts