본문 바로가기
[ Program ]/c#스터디

60. 유저컨트롤

by 관이119 2022. 5. 17.

유저컨트롤은 사용자가 임의로 만들어서 사용하는 컨트롤이다.

로또 추첨기를 생각 해보자.

숫자가 1~45까지 순차적으로 증가한 후 랜덤 숫자로 최종 결정 되는식으로 6개의 숫자를 출력해주는 프로그램이 있다고 생각해보자.

그러면 6개의 컨트롤을 다 만들어 줄 필요없이 1~45까지 순차적으로 증가한후 랜덤 숫자로 최종 결정되는 컨트롤이 있다면 그 컨트롤을 복사해서 사용해주면 훨씬 편할것이다.

간단하게 만들면서 이해해 보자.

 

그림1

그림1처럼 컨트롤 라이브러리를 선택해서 프로젝트를 만들자.

(.NET Framework) 확인.

 

그림2

최초 생성하면 그림2와 같은 화면으로 나올것이다.

중앙의 회색부분이 내가만들컨트롤 크기이다.

그림3

 

그림3과 같이 좌측의 도구상자에서 label 을 드래그 해서 중앙에 놔주고 컨트롤의 크기를 적당히 조절해주자.

그리고 아래와 같이 입력해주자.

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
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;
using System.Threading;
 
namespace WindowsFormsControlLibrary1
{
    public partial class UserControl1: UserControl
    {
        private bool _start = false;
        public bool start
        {
            set
            {
                _start = value;
                if (_start)
                {
                   label1change();
                    _start = false;
                }
            }
        }
 
        public UserControl1()
        {
            InitializeComponent();
            label1.Text = "_";
        }
 
        public async void label1change()
        {
            await Task.Run(() =>
            {
                for (int i = 1; i <= 45; i++)
                {
                    Thread.Sleep(50);
                    label_text_change(label1, i.ToString());
                }
            });
 
            label_text_change(label1, new Random().Next(45).ToString());
        }
 
        public void label_text_change(Label lb, string i)
        {
            if (lb.InvokeRequired)
            {
                lb.Invoke((Action)delegate () { lb.Text = i; });
            }
            else
            {
                lb.Text = i;
            }
        }
    }
}
 
cs

 

컨트롤이 최초에 label1 이라고 표시 되어있으면 시각적으로 좋지않기 때문에 생성자에서 label1.Text = "_"; 코드로 시작할때는 _ 로 표시되게 해줬다.

그리고 아래 label1change 함수와 label_text_change 함수는 이전장들에서 사용하던 예제이기때문에 설명을 생략하겠다.

위쪽에 start 속성은 값을 받고 그값이 true 일때는 label1change 함수를 호출하게 해놨다.

컨트롤이 외부에서 값을 변경하면 시작되게 해놓은 부분이다.

이부분은 이벤트로도 가능한데 이벤트는 다음장에서 살펴보자.

위코드에서는 start 속성이 true로 되면 숫자가 변하다가 최종숫자까지 변경되면 랜덤숫자로 변경될 거라고 예상할 수 있다.

 

위와같이 작업후 컨트롤 추가해주면 해당 컨트롤을 사용할 수 있다.

일단 빌드를 해주자.

그림4

그림4와 같이 dll 이 생성되면 해당경로를 기억해두고 이제 만든 컨트롤을 사용할 프로젝트를 만들어보자.

 

그림5

그림5와 같이 새프로젝트를 만들고 도구상자를 열어서 일반항목에서 마우스 우클릭으로 항목선택을 클릭하자.

 

그림6

그림6과 같은 팝업이 뜨면 찾아보기로 아까 빌드해둔 dll 을 찾아서 선택한 후 확인을 눌러주자.

 

그림7

그렇게 작업해주면 그림7과 같이 만들어준 컨트롤을 사용할수 있게 표시가 된다.

그리고 드래그 해서 일반컨트롤처럼 사용해주면 된다.

 

 

그림8

 

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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace WindowsFormsApp13
{
    public partial class Form13 : Form
    {
        public Form13()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            userControl11.start = true;
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            userControl12.start = true;
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            userControl13.start = true;
        }
    }
}
 
cs

그림8과 위코드처럼 코드를 작성해주고 실행해보자.

버튼을 누르면 내가만든 해당 컨트롤이 숫자가 변하면서 최종숫자로 변경되는 것을 볼 수 있을것이다.

물론 처음만든 유저컨트롤에 버튼까지 넣어서 만들 수 도 있다.

 

***숙제 : 본문에서 만든 컨트롤에 버튼까지 포함된 컨트롤을 만들어보자.

'[ Program ] > c#스터디' 카테고리의 다른 글

62.네트워크프로그램  (0) 2022.05.20
61. 이벤트  (0) 2022.05.18
59. lock / Monitor / Mutex  (0) 2022.05.11
58. Threadpool / BackgroundWorker / Parallel  (0) 2022.05.11
57. async / await  (0) 2022.03.29

댓글