본문 바로가기

프로그래밍 언어/C#

TextBox 컨트롤 배열 생성 및 Event 구문 등록 방법

일정 수 이상의 컨트롤들을 배치 하거나, 값을 넣거나 할 경우 배열로 선언해서 처리하면, 조금이나마 보기도 좋고, 값을 넣기도 편하다

우선 아래와 같이 전역 변수를 먼저 선언한다.

public TextBox[] txtBox; // 컨트롤 배열로 사용할 TextBox 전역변수 선언
public const int txtBox_num = 10; // 생성할 텍스트 박스 갯수 설정

 

 


실제로 TextBox를 생성하는 함수를 아래와 같이 코딩한다.

private void create__txtBox()
{
	Int32 idx;

	txtBox = new TextBox[txtBox_num];

	for (idx = 0; idx < txtBox.Length; idx++)
	{
		// 새 인스턴스 생성
		txtBox[idx] = new TextBox();

		// 기본옵션 설정
		txtBox[idx].Name = "txt" + idx.ToString("00");
		txtBox[idx].Text = "";
		txtBox[idx].Width = 32;
		txtBox[idx].Height = 21;
		txtBox[idx].Tag = idx.ToString();

		// 이미 생성되어 있는 그룹박스 각각에 TextBox를 10개씩 생성하면서 위치까지 지정함.
		if(idx < 10)
		{
			groupBox1.Controls.Add(txtBox[idx]);
			if (idx == 0)
			{
				set_Position__txtBox(txtBox[idx], 10, 20, 200);
			}
			else
			{
				set_Position__txtBox(txtBox[idx], 10, txtBox[idx - 1].Top + 27, 200);
			}
		}
		else
		{
			groupBox2.Controls.Add(txtBox[idx]);
			if (idx == 10)
			{
				set_Position__txtBox(txtBox[idx], 10, 20, 200);
			}
			else
			{
				set_Position__txtBox(txtBox[idx], 10, txtBox[idx - 1].Top + 27, 200);
			}
		}

		txtBox[idx].KeyUp += txtBoxEvent__KeyUp;	//KeyUp Event 등록
	}
}

키 입력에 해당되는 Event 함수는 아래와 같이 Form1_KeyPress 라는 함수를 만들면 된다.

public void txtBoxEvent__KeyUp(object sender, KeyEventArgs e)
{
	if (e.KeyCode == Keys.Enter)
	{
		// 이벤트가 발생한 컨트롤의 핸들 얻기
		TextBox h_txtBox = (TextBox)sender;

		// 컨트롤 번호 얻기
		int ctrl_num = Convert.ToInt32(h_txtBox.Tag);

		// 마지막 박스에서는 다음으로 이동하지 않는다. (오류방지)
		if (ctrl_num < txtBox_num - 1)
		{
			txtBox[ctrl_num + 1].Focus();
		}
	}
}

코드로 생성되는 TextBox는 모두 위치를 지정해줘야 하므로, 아래와 같이 코딩하면 된다.

private void set_Position__txtBox(TextBox txtBox, int Left, int Top, int Width)
{
	txtBox.Left = Left;
	txtBox.Top = Top;
	txtBox.Width = Width;
}

생성된 모든 컨트롤들 중에서 TextBox의 이름만 가져 오는 함수는 아래와 같이 만들면 된다.

private void get__ctrl_name__txtBox(Control ctrl)
{
	// 대상 컨트롤의 하위에 있는 모든 컨트롤을 대상으로 스캔한다.
	foreach (Control tmpCtrl in ctrl.Controls)
	{
		// 재귀호출 : 컨트롤이 또 다른 컨트롤을 품고 있으면 하위의 끝까지 스캔한다.
		if (tmpCtrl.Controls.Count > 0)
		{
			get__ctrl_name__txtBox(tmpCtrl);
		}

		// 현재 스캔중인 컨트롤이 TextBox 형식이면...
		if (tmpCtrl is TextBox)
		{
			TextBox txtBox = (TextBox)tmpCtrl; // TextBox 으로 형 변환 한다.
			txtLog.AppendText(txtBox.Name.ToString() + "\n"); // 현재 컨트롤 이름 Log 추가
		}
	}
}