UserControl
Winform에서 기본적으로 제공하는 Control 외 사용자가 원하는 형태의 Control을 만들어서 사용 가능
- 사용 이유 : Code를 분리해서 가독성을 높여 줄 수 있음.
Control들의 재사용성이 뛰어남.
Delegate(델리게이트)
- delegate란?
- 대리자를 의미함.
- 함수(메서드)를 참조하기 위한 데이터 형식(데이터형)
- 즉, 델리게이트는 메서드를 참조하기 위한 데이터 형식
- 델리게이트는 시그니처(메서드 형식)가 동일한 하나 이상의 메서드를 참조할 수 있음.
- 델리게이트를 호출하면 참조하고 있는 메소드가 호출됨
- 델리게이트를 사용하여 이벤트가 발생할 때 실행되는 메서드(이벤트 핸들러)를 등록하고 처리할 수 있음.
- delegate 사용 이유
- UI 관련 컴포넌트에 여러가지 함수를 직접 넣으면 로직이 꼬일 수 있음.
- 사용하려는 함수가 수정 불가능할 수 있음.
- delegate 사용 방법
접근제한자 delegate 반환타입 대리자이름(매개변수)
<delegate를 활용한 UserControl 화면 전환>
using System;
using System.Windows.Forms;
using static Test.Form1;
namespace Test
{
public partial class UserControl1 : UserControl
{
public delegate void ChangeUserControl_Event(int Tag);
public ChangeUserControl_Event changeUserControl;
public UserControl1()
{
InitializeComponent();
}
private void ChangFrame_Click(object sender, EventArgs e)
{
changeUserControl(userControlTagNum.CONTROL2_TAG);
}
}
}
using System;
using System.Windows.Forms;
using static Test.Form1;
namespace Test
{
public partial class UserControl2 : UserControl
{
public delegate void ChangeUserControl_Event(int Tag);
public ChangeUserControl_Event changeUserControl;
public UserControl2()
{
InitializeComponent();
}
private void ChangeFrame_Click(object sender, EventArgs e)
{
changeUserControl(userControlTagNum.CONTROL1_TAG);
}
}
}
필자는 Form에서 UserControl로 화면 전환을 하는 것이 아닌, Form에 빈 panel을 만들어준 다음,
UserControl1과 UserControl2의 화면 전환을 해볼 것이다.
상단 코드가 UserControl1, 하단 코드가 UserControl2 코드이다.
2개의 코드 거의 비슷하다.
UserControl1과 UserControl2의 화면 전환을 위한 delegate를 선언해주고 각 UserControl의 버튼을 클릭하면
Form에서 생성한 userControlTagNum에서 지정한 Tag를 받고 넘어간다.
using System;
using System.Windows.Forms;
namespace Test
{
public partial class Form1 : Form
{
UserControl1 userControl1;
UserControl2 userControl2;
public Form1()
{
InitializeComponent();
userControl1 = new UserControl1();
userControl2 = new UserControl2();
userControl1.changeUserControl += Change;
userControl2.changeUserControl += Change;
}
public class userControlTagNum
{
static public readonly int CONTROL1_TAG = 0;
static public readonly int CONTROL2_TAG = 1;
}
public void Change(int Tag)
{
switch (Tag)
{
case 0: ChangeControl(userControl1); break;
case 1: ChangeControl(userControl2); break;
}
}
public void ChangeControl(Control userControl)
{
panel1.Controls.Clear();
panel1.Controls.Add(userControl);
userControl.Dock = DockStyle.Fill;
}
private void Form1_Load(object sender, EventArgs e)
{
panel1.Controls.Add(userControl1);
userControl1.Size = panel1.Size;
}
}
}
Form1의 코드이다.
UserControl1과 UserControl2에서 선언해준 delegate를 Form1의 Change 메서드의 이벤트를 연결해준다.
앞서 얘기했던 것 처럼 delegate가 Change메서드의 기능을 해주며, Tag값을 받은대로 switch에서 해당 필드로 넘어간다.

userControl1의 화면에서 버튼을 누르면,

userControl2의 화면으로 넘어간다.
'IT > C# Windows Form(.NET Framework)' 카테고리의 다른 글
| ZedGraph를 이용한 시간별 Value 측정(2) (0) | 2025.01.24 |
|---|---|
| ZedGraph를 사용한 시간별 Value 측정(1) (0) | 2025.01.23 |
| OpenFileDialog / SaveFileDialog (0) | 2025.01.16 |
| PictureBox (0) | 2025.01.16 |
| DLL(Dynamic Link Library) (1) | 2025.01.16 |