티스토리 뷰
======================================================
안녕하세요 Doridori 입니다.
이번 강의는 UserControl(사용자 정의 컨트롤)에 대한 강의 입니다.
UserContrl의 경우 프로그램의 규모가 커지면 필수가 되는 부분이라고 할 수있습니다.
물론 devexpress 같은 UI Component 사용 한다면 필요 없을 수도 있지만 돈을 주고 구입해야 하기 때문에 사용하지 않는 경우도 많습니다.
저희는 배우는 단계이니 굳이 저런거 필요 없습니다. 흥칫뿡!
꼭 익숙해져서 자주 사용하시면 좋습니다.~!
======================================================
UserControl (사용자 정의 컨트롤)
Source UI) Study_29_UserControl (UI).zip
Soruce 전체) Study_29_UserControl.zip
교재) 29강 UserControl (사용자 정의 컨트롤).pdf
사용자 정의 컨트롤이란 말 그대로 사용자가 기본적으로 제공하는 Control 외 별도로 사용자가 원하는대로 Control을 제작해서 사용하는 내용 입니다.
간단하게 내가 글자를 입력하면 자동으로 색상이 변하는 Label을 사용하고 싶어~! 라고 할때 기존 Label에 Text Change Event에 Lable 색상 변경을 추가하면 되겠지만 이런 Label을 곳곳에 많이 추가해야 하는 경우라면 작업량이 무척이나 많아지게 됩니다.
이럴경우 색상이 변하는 Label을 만들어서 등록해서 사용하게 되면 그냥 가져다 쓰기만 하면 되기때문에 매우 편리해 집니다.
이게 UserControl에 대한 설명의 전부 입니다. ^^;; (참 쉽죠~!)
UI)
예전에 만들었던 학생 기록부 관리하는것 같은 걸 만들까도 했는데 너무 똑같아 지니까 색다르게 현상금 계시판을 만들어 보았습니다.
보통 UserControl에 대한 내용을 하게 되면 Label + Button 정도 하고 끝내는데 (많으면 속성까지 추가해보기도 합니다.)
이유는 Winform 강의를 할때 보통은 앞쪽에서 강의를 많이 하게 됩니다.
하지만 저는 아껴놓고 아껴놓았다가 뒤에 진행하였기 때문에 우리가 배웠던 Delegate를 추가해서 Event 까지 추가해 보도록 하겠습니다. (와~! O,O//)
강의)
UserControl의 경우 어려운 내용이 없기때문에 차근차근 한번 따라해 보시고 원하는 Control을 한번 만들어 보시면 바로이해가 될것 같습니다.
Source)
UserControl 부분과 Main 부분이 있는데 보시면 Main에는 Source가 거의 없는 것을 알 수 있습니다.
소스를 모듈화 시키는데에도 아주 좋다고 볼 수 있습니다. ^^
UCInfo (UserControl)
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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | 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 _29_UserControl { public partial class UCInfo : UserControl { // Control의 부모 쪽으로 전달할 Event Delegate public delegate int delEvent(object Sender, string strText); // delegate 선언 public event delEvent eventdelSender; // delegate event 선언 // Control의 속성값을 정의 [Category("UserProperty"), Description("Image")] public Image UserFace { get { return this.pboxFace.BackgroundImage; } set { this.pboxFace.BackgroundImage = value; } } [Category("UserProperty"), Description("No")] public string UserNo { get { return this.lblNo.Text; } set { this.lblNo.Text = value; } } [Category("UserProperty"), Description("현상범의 이름")] public string UserName { get { return this.lblName.Text; } set { this.lblName.Text = value; } } [Category("UserProperty"), Description("현상범의 금액")] public string UserGold { get { return this.lblGold.Text; } set { this.lblGold.Text = value; } } /// <summary> /// UserControl 진입점 /// </summary> public UCInfo() { InitializeComponent(); } /// <summary> /// UserControl Button Event를 한곳으로 모아 놓은 부분 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btn_Click(object sender, EventArgs e) { string strText = string.Empty; Button oBtn = sender as Button; // object 형태로 되어 있는 sender를 Button 형태로 형변환 switch (oBtn.Name) { case "btnReg": this.BackColor = Color.Red; strText = string.Format("{0}은 금액 {1}으로 수배중 입니다.", lblName.Text, lblGold.Text); break; case "btnIdle": this.BackColor = Color.Yellow; strText = string.Format("{0}은 수배 중지 상태 입니다.", lblName.Text); break; case "btnCatch": this.BackColor = Color.Green; strText = string.Format("{0}은 잡혔습니다.", lblName.Text); break; default: break; } if (eventdelSender != null) // 부모가 Event를 생성하지 않았을 수 있으므로 생성 했을 경우에만 Delegate를 호출 { eventdelSender(this, strText); } } } } | cs |
Main)
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 | 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 _29_UserControl { public partial class Form1 : Form { /// <summary> /// Program 진입점 /// </summary> public Form1() { InitializeComponent(); } /// <summary> /// Program을 Load 했을 경우에 발생 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void Form1_Load(object sender, EventArgs e) { // pMain Control 안에서 생성한 UserControl을 찾아서 형변환 한 뒤 Event를 생성 함 foreach (var oControl in pMain.Controls) { if (oControl is UCInfo) { UCInfo oInfo = oControl as UCInfo; oInfo.eventdelSender += OInfo_eventdelSender; } } } /// <summary> /// UserControl Delegate Event /// </summary> /// <param name="Sender"></param> /// <param name="strText"></param> /// <returns></returns> private int OInfo_eventdelSender(object Sender, string strText) { UCInfo oInfo = Sender as UCInfo; lboxList.Items.Add(string.Format("{0}) {1}", oInfo.UserNo, strText)); return 0; } } } | cs |
'C# > C# 강좌 Winform' 카테고리의 다른 글
Doridori C# 강의) 31.Linq (링큐) (14) | 2019.02.22 |
---|---|
Doridori C# 강의) 30.Lambda (람다식) (8) | 2019.02.08 |
Doridori C# 강의) 28. 예외처리 (Exception) (19) | 2019.01.13 |
Doridori C# 강의) 27.Thread Stop (16) | 2018.12.30 |
Doridori C# 강의) 26.Thread (19) | 2018.12.25 |
- Total
- Today
- Yesterday
- 보드카
- 소주
- 전통주
- 도리도리 C#
- Visual Studio
- 나들이
- 프로그램 강의
- 칵테일
- 서울
- 맥주
- 가볼만한 곳
- 위스키
- 술
- 와인
- C#
- 증류주
- 모바일
- 막걸리
- 도리도리
- WinForm
- 아이랑
- 가볼만한곳
- 하이볼
- C# 기초 강의
- 광저우
- C# 강좌
- 맛집
- C# 강의
- 주말
- 게임
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |