UserControl(사용자 정의 컨트롤)

2025. 1. 16. 13:52·IT/C# Windows Form(.NET Framework)

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
'IT/C# Windows Form(.NET Framework)' 카테고리의 다른 글
  • ZedGraph를 사용한 시간별 Value 측정(1)
  • OpenFileDialog / SaveFileDialog
  • PictureBox
  • DLL(Dynamic Link Library)
Byulpa
Byulpa
  • Byulpa
    Byulpa 님의 블로그
    Byulpa
  • 전체
    오늘
    어제
    • 분류 전체보기 (13)
      • IT (10)
        • C#(.NET Framework) (4)
        • C# Windows Form(.NET Framew.. (6)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Byulpa
UserControl(사용자 정의 컨트롤)
상단으로

티스토리툴바