Please Enable JavaScript!
Mohon Aktifkan Javascript![ Enable JavaScript ]

[Windows Form] 사용자 정의 컨트롤

2016. 1. 22. 18:06programming/c#

728x90

자주 사용하는 컨트롤에 대해서는 사용자 정의 컨트롤로 정의를 하고 가져다 쓰면


재사용의 의미로 효율적으로 사용이 가능합니다.


우선 사용자 정의 컨트롤을 만들기 위해



클래스 라이브러리 (.dll)를 만드는 프로젝트를 생성합니다.



프로젝트에서 추가 - 새 항목 추가 - 사용자 정의 컨트롤을 하나 추가합니다.



그럼 위 그림과 같이 네모 상자가 생길 것입니다. 이 부분에 자신이 만들 사용자 정의 컨트롤을 왼쪽 도구상자에서 끌어다 배치를 합니다.






위에는 예시를 위해 여러가지를 넣어봤습니다.


Windows Form 과 하는 방식은 같습니다.


마지막 사진을 가지고 예제를 보여드릴게요.




LabelComboBoxButton이라는 이름을 가진 사용자 정의 컨트롤 입니다.

LabelComboBoxButton.Designer.cs 디자이너에 관한 코드 부분 정의

LabelComboBoxButton.resx

XML 태그 내에 개체와 문자열을 지정하는 XML 엔트리로 구성됩니다. 메모장이나 Microsoft Word 같은 텍스트 편집기에서 .resx 파일을 열면 파일에 대한 쓰기, 구문 분석 및 조작이 가능합니다. .resx 파일을 볼 때 이 이진 정보가 리소스 매니페스트의 일부인 경우에는 포함된 개체(예: 그림)의 이진 형식을 실제로 볼 수 있습니다. 이 이진 정보와는 별도로 .resx 파일을 완벽하게 읽고 유지 관리할 수 있습니다.


LabelComboBoxButton 코드 입력 부분입니다.


사용자 정의 컨트롤을 만들고 프로젝트를 꼭 빌드를 해줍니다.



사용자 정의 컨트롤을 만들기위해서 프로젝트를 클래스 라이브러리 형태로 만들었는데


같은 솔루션 안에 Windows Form을 만들 수 있는 프로젝트를 하나 더 생성합니다.



클래스 라이브러리 프로젝트를 빌드하고 WIndows Form에서 도구상자를 보면



위 그림과 같이 UserControl 구성요소로 직접 만든 사용자 정의 컨트롤 목록을 볼 수 있습니다.


이곳에서 안보인다면 다음과 같이 추가하면 됩니다.





도구상자 빈 공간 마우스 우 클릭 - 항목 선택 -








이 부분에서 찾아보기를 눌러


사용자 정의 컨트롤을 만든 클래스 라이브러리 프로젝트 경로에서 - bin - debug 폴더 안 dll 폴더가 있습니다.



이런 방식으로도 추가가 가능합니다.


아까 만든 사용자 정의 컨트롤을 Windows Form 으로 옮겨보겠습니다.




해당 컨트롤이 Name 값이


입니다.


그러면 라벨의 이름과 버튼의 이름을 바꿔볼까요


라벨의 Name 값은 


입니다.


labelCOmboBoxButton1.lbl 이 될까요..?


안됩니다.


현재 위에 있는 라벨과 콤보박스 버튼은 하나의 컨트롤로 정의가 되어있기 때문에 하나의 속성에 접근이 불가능합니다.


아래와 같이 get,set 을 이용하여 속성 값에 접근을 하면 가능합니다.


사용자 정의 코드 부분입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace ITSM
{
    public partial class LabelComboBoxButton : UserControl
    {
 
 
        public LabelComboBoxButton()
        {
            InitializeComponent();
        }
 
        private void MaintenanceCategory_Load(object sender, EventArgs e)
        {
 
        }
 
        public string AddItems
        {
            set { comboboxCategory.Items.Add(value); }
 
        }
 
        public string SetLabelText
        {
            set { lbl.Text = value; }
        }
        
        public string SetButtonName
        {
            set { btn.Text = value; }
        }
        
    }
}
 
 
cs


Windows Form에서 아래와 같이 접근이 가능하게 됩니다.


1
2
3
4
5
6
        private void Form1_Load(object sender, EventArgs e)
        {
            labelComboBoxButton1.SetLabelText = "라벨입니다.";
        }
 
 
cs





실행 결과 원하는 라벨 부분만 변경이 가능합니다.


다른 컨트롤도 마찬가지로 하면 됩니다용


만약에 한 개의 컨트롤을 가지고 사용자 정의 컨트롤을 정의할 경우



위와 같이 라벨을 하나 끌어다 사용하지 않고,

1
2
3
4
5
6
7
8
9
10
11
12
 namespace ITSMUserControl
{
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
    }
}
 
 
cs


UserControl을 상속 받지 않고, 해당 컨트롤을 바로 상속 받습니다.

지금 하고있는 부분은 Label 이므로 Label로 상속을 받습니다.





변경 하면 위와 같은 오류가 발생합니다.


UserControl로 부터 상속을 받지 않기에 참조가 안됩니다..



해당 오류를 더블클릭하여 코드로 이동하고 이부분을 삭제합니다.


오류가 사라지고


생성한 사용자 정의 컨트롤 디자인 부분을 보면



위와 같이 변경됩니다.


Windows Form에 바로


이런 형식으로 가져오기가 가능합니다.


Label이 아닌 UserControl로 받아오면



와 같이 라벨을 제외한 나머지 배경도 같이 컨트롤로 잡히기 때문입니다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
namespace ITSM_Manager
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            userControl11.Text = "테스트";
        }
    }
}
 

cs



Windows Form에서는 원래 도구상자에서 Label을 사용하는 것 처럼 속성 접근이 가능합니다.



사용자 정의 컨트롤을 처음 사용하면서 어려움을 겪어 남기게 되는 글...


도움이 누군가에겐 되길 바라며...

728x90