* 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
'C# Programming' 카테고리의 다른 글
[C#] [API] PC (종료,재시작) 또는 Diagnostics.Process 이용 PC (종료,재시작) (1) | 2020.01.03 |
---|---|
[C#] 프로젝트 리소스 (Resources) 에 추가된 이미지 불러오기 (0) | 2020.01.01 |
[C#] 시간 체크 (Time Check) (0) | 2019.12.27 |
[C#] PC 비프음 (Beep) (0) | 2019.12.27 |
[C#] [API] 윈도우 창 찾기 (Window Form Search) (0) | 2019.12.20 |