반응형
1. 강의 개요
이번 강의에서는 TabControl을 사용하여 다중 페이지 인터페이스를 구성하는 방법을 학습합니다.
TabControl은 탭을 클릭하여 각기 다른 페이지를 표시할 수 있는 컨트롤로, 사용자 친화적인 UI를 제공하는 데 매우 유용합니다.
2. 학습 목표
- TabControl을 사용해 다중 페이지 UI 구성.
- 탭(Page)마다 컨트롤을 추가하고 독립적인 동작 구현.
- 동적으로 탭 추가 및 삭제 기능 구현.
3. TabControl이란?
TabControl은 여러 개의 탭(Tab)과 해당 탭에 표시되는 컨텐츠를 관리하는 컨트롤입니다.
- 각 탭은 독립적인 TabPage를 포함하며, 페이지마다 별도의 UI를 구성 가능.
- 탭을 클릭하여 다양한 콘텐츠를 쉽게 탐색할 수 있음.
TabControl 주요 속성 및 메서드
속성/메서드 설명 예제
TabPages | TabPage 객체의 컬렉션 | tabControl1.TabPages.Add(new TabPage("Tab 1")); |
SelectedIndex | 현재 선택된 탭의 인덱스 | int index = tabControl1.SelectedIndex; |
SelectedTab | 현재 선택된 TabPage 객체 | TabPage current = tabControl1.SelectedTab; |
TabControl 주요 이벤트
이벤트 설명 예제
SelectedIndexChanged | 선택된 탭이 변경되었을 때 발생 | tabControl1.SelectedIndexChanged += ...; |
4. 실습: TabControl을 활용한 다중 페이지 인터페이스 구현
요구사항
- TabControl에 "홈", "설정" 두 개의 탭을 추가.
- "설정" 탭에서 TextBox를 사용해 설정 값을 입력받고 저장.
- "홈" 탭에서 Label에 설정 값을 표시.
- 버튼으로 탭을 동적으로 추가 및 삭제.
폼 구성
컨트롤 타입 이름 텍스트 위치 크기
TabControl | tabControl1 | (없음) | 폼 중앙 | (400 x 250) |
Button | btnAddTab | "탭 추가" | 폼 하단 왼쪽 | (100 x 30) |
Button | btnRemoveTab | "탭 삭제" | 폼 하단 오른쪽 | (100 x 30) |
코드 작성
Form1.cs
using System;
using System.Windows.Forms;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private string savedSetting = string.Empty; // 저장된 설정 값
public Form1()
{
InitializeComponent();
InitializeTabControl();
}
private void InitializeTabControl()
{
// TabControl 기본 설정
tabControl1.Dock = DockStyle.Top;
// "홈" 탭 추가
TabPage homeTab = new TabPage("홈");
Label lblHome = new Label
{
Text = "저장된 설정: (없음)",
AutoSize = true,
Location = new System.Drawing.Point(20, 20),
Name = "lblHome"
};
homeTab.Controls.Add(lblHome);
tabControl1.TabPages.Add(homeTab);
// "설정" 탭 추가
TabPage settingsTab = new TabPage("설정");
TextBox txtSetting = new TextBox
{
Location = new System.Drawing.Point(20, 20),
Width = 200,
Name = "txtSetting"
};
Button btnSaveSetting = new Button
{
Text = "저장",
Location = new System.Drawing.Point(240, 18),
Name = "btnSaveSetting"
};
btnSaveSetting.Click += (sender, e) =>
{
savedSetting = txtSetting.Text;
lblHome.Text = $"저장된 설정: {savedSetting}";
MessageBox.Show("설정이 저장되었습니다!", "알림");
};
settingsTab.Controls.Add(txtSetting);
settingsTab.Controls.Add(btnSaveSetting);
tabControl1.TabPages.Add(settingsTab);
// 탭 추가 및 삭제 버튼 이벤트
btnAddTab.Click += BtnAddTab_Click;
btnRemoveTab.Click += BtnRemoveTab_Click;
}
// "탭 추가" 버튼 클릭 이벤트
private void BtnAddTab_Click(object sender, EventArgs e)
{
TabPage newTab = new TabPage($"새 탭 {tabControl1.TabPages.Count + 1}");
Label lblNewTab = new Label
{
Text = "이 탭은 동적으로 추가되었습니다.",
AutoSize = true,
Location = new System.Drawing.Point(20, 20)
};
newTab.Controls.Add(lblNewTab);
tabControl1.TabPages.Add(newTab);
}
// "탭 삭제" 버튼 클릭 이벤트
private void BtnRemoveTab_Click(object sender, EventArgs e)
{
if (tabControl1.TabPages.Count > 0)
{
tabControl1.TabPages.RemoveAt(tabControl1.SelectedIndex);
}
else
{
MessageBox.Show("삭제할 탭이 없습니다.", "알림");
}
}
}
}
Form1.Designer.cs
namespace WindowsFormsApp1
{
partial class Form1
{
private System.ComponentModel.IContainer components = null;
private TabControl tabControl1;
private Button btnAddTab;
private Button btnRemoveTab;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.tabControl1 = new TabControl();
this.btnAddTab = new Button();
this.btnRemoveTab = new Button();
this.SuspendLayout();
// tabControl1
this.tabControl1.Location = new System.Drawing.Point(10, 10);
this.tabControl1.Name = "tabControl1";
this.tabControl1.Size = new System.Drawing.Size(400, 250);
this.tabControl1.TabIndex = 0;
// btnAddTab
this.btnAddTab.Location = new System.Drawing.Point(10, 270);
this.btnAddTab.Name = "btnAddTab";
this.btnAddTab.Size = new System.Drawing.Size(100, 30);
this.btnAddTab.TabIndex = 1;
this.btnAddTab.Text = "탭 추가";
this.btnAddTab.UseVisualStyleBackColor = true;
// btnRemoveTab
this.btnRemoveTab.Location = new System.Drawing.Point(120, 270);
this.btnRemoveTab.Name = "btnRemoveTab";
this.btnRemoveTab.Size = new System.Drawing.Size(100, 30);
this.btnRemoveTab.TabIndex = 2;
this.btnRemoveTab.Text = "탭 삭제";
this.btnRemoveTab.UseVisualStyleBackColor = true;
// Form1
this.AutoScaleDimensions = new System.Drawing.SizeF(8F, 20F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(420, 320);
this.Controls.Add(this.btnRemoveTab);
this.Controls.Add(this.btnAddTab);
this.Controls.Add(this.tabControl1);
this.Name = "Form1";
this.Text = "TabControl 예제";
this.ResumeLayout(false);
}
}
}
5. 실행 결과
- 초기 상태
- "홈"과 "설정" 두 개의 탭이 생성됩니다.
- "홈" 탭에는 저장된 설정 값을 표시하는 Label이, "설정" 탭에는 TextBox와 "저장" 버튼이 있습니다.
- 설정 저장
- "설정" 탭에서 값을 입력하고 "저장" 버튼 클릭 → "홈" 탭에 설정 값이 표시됩니다.
- 탭 추가
- "탭 추가" 버튼 클릭 → 새로운 탭이 추가되며, 기본 메시지가 표시됩니다.
- 탭 삭제
- "탭 삭제" 버튼 클릭 → 현재 선택된 탭이 삭제됩니다.
6. 주요 개념 요약
- TabControl과 TabPage
- TabControl.TabPages 컬렉션을 통해 TabPage 추가 및 제거 가능.
- 탭 동작 관리
- SelectedIndex와 SelectedTab 속성을 활용하여 현재 선택된 탭의 동작 관리.
- 탭 동적 추가 및 삭제
- TabPages.Add()와 TabPages.RemoveAt() 메서드로 동적으로 탭 추가 및 삭제 구현.
반응형
'📁 [4] 개발자 정보 & 코드 노트 > C#' 카테고리의 다른 글
C# Windows Forms 강의 38편: TreeView로 계층적 데이터 표시 (0) | 2025.03.13 |
---|---|
C# Windows Forms 강의 37편: ListView를 활용한 데이터 목록 표시 (0) | 2025.03.12 |
C# Windows Forms 강의 35편: SplitContainer로 가변 레이아웃 구성 (0) | 2025.03.10 |
C# Windows Forms 강의 34편: TableLayoutPanel을 활용한 유연한 레이아웃 관리 (0) | 2025.03.09 |
C# Windows Forms 강의 33편: Panel과 ScrollBar를 활용한 스크롤 가능한 인터페이스 만들기 (0) | 2025.03.08 |