일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 소스 코드
- 언제나휴일
- 안드로이드 앱 개발
- 졸업 작품 소재
- 실습
- 원격 제어 프로그램
- 동영상 강의
- 실습으로 다지는 c#
- 유튜브 동영상 강의
- 강의
- 표준 라이브러리 함수
- 언제나 휴일
- 클래스 다이어그램
- 충남 천안
- Windows Forms
- c#
- 무료 동영상 강의
- 추천
- 파이썬
- 네트워크 프로그래밍
- c언어
- 소켓 통신
- 산책하기 좋은 곳
- 프로젝트
- C++
- 캡슐화
- 알고리즘
- 표준 입출력
- 독립기념관
- 동영상
- Today
- Total
프로그래밍 언어 및 기술 [언제나휴일]
1. 6 Windows Form 본문
이번에는 간단하게 Windows Form 응용 프로그램을 만들기 위해 필요한 기술을 알아봅시다. 먼저 윈도우즈 응용 프로그램을 만들기 위해 Windows Forms 응용 프로그램 템플릿을 선택합니다.
Windows Forms 응용 프로젝트를 생성하면 기본적으로 진입점이 있는 Program.cs 파일과 MainForm에 관한 두 개의 소스 파일로 Form1.cs와 Form1.Designer.cs이 만들어집니다. Program.cs 파일에는 Form1 개체를 생성하여 닫힐 때까지 수행할 수 있는 코드 등이 자동으로 만들어진 상태입니다. 특이 사항이 없으면 Windows Forms 응용 프로그램을 제작하면서 이 부분을 수정할 필요는 없습니다.
그리고 Form1.cs는 개발자가 작성할 부분이며 Form1.Designer.cs는 통합 개발 환경의 디자인 창에서 자식 컨트롤 배치나 속성 지정 및 이벤트 핸들러를 추가한 부분의 코드를 마법사에 의해 작성해 주는 부분입니다. 마찬가지로 개발자는 Form1.Designer.cs 부분을 수정할 필요는 거의 없습니다.
▶ Program.cs의 Program 클래스의 코드 내용
static class Program
{
/// <summary>
/// 해당 응용 프로그램의 주 진입점입니다.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
Windows Form 프로젝트를 생성할 때 만들어진 메인 폼의 이름이 Form1인데 이를 자신이 원하는 이름으로 변경하세요.
위처럼 작업하면 Form1.cs 파일 이름과 Form1.Designer.cs 파일 이름이 자동으로 바뀌고 Form1 클래스 이름도 원하는 이름으로 바뀌는 것을 알 수 있습니다. 또한 Program.cs 파일에서 new Form1() 호출 부분도 바꾼 이름으로 자동으로 바꿔줍니다. 이 책에서는 자동으로 만들어진 Form1 이름을 언제나 MainForm으로 변경하고 있습니다.
그리고 속성 창을 이용하면 디자인 창의 다양한 컨트롤의 속성을 효과적으로 설정하거나 확인할 수 있습니다.
속성 창에서는 컨트롤이나 폼의 속성을 설정 및 확인할 수 있고 이벤트 핸들러를 설정 및 확인할 수 있습니다. 속성 창의 툴 바에는 항목 별로 정렬하거나 알파벳 순으로 정렬할 수 있는 버튼을 제공합니다. 그리고 뒤에 나오는 두 개의 버튼은 속성과 이벤트 핸들러를 의미합니다.
그리고 도구 상자를 이용하여 자식 컨트롤을 쉽게 배치할 수 있습니다.
물론 배치한 컨트롤의 속성이나 이벤트 핸들러 등은 속성 창을 통해 쉽게 설정 및 확인할 수 있습니다.
1.6.1 간단한 Windows Forms 응용 만들기
이제 간단하게 아이디와 이름을 입력받아 리스트 상자의 항목에 아이디를 추가하고 이를 항목을 선택하면 선택한 항목의 이름을 레이블 컨트롤의 속성을 이용하여 변화하는 간단한 프로그램을 작성해 봅시다. 먼저 MainForm에 자식 컨트롤을 배치합니다.
번호 | 컨트롤 이름 | 컨트롤 유형 | 설명 |
1 | lb_id | Label | Text 속성: 아이디: |
2 | tbox_id | TextBox | |
3 | lb_name | Label | Text 속성: 이름: |
4 | tbox_name | TextBox | |
5 | btn_add | Button | |
6 | lbox_member | ListBox | |
7 | lb_name2 | Label | Text 속성: [홍길동] |
[표 1.1] MainForm의 자식 컨트롤
이 프로그램에서는 회원 데이터를 관리할 것입니다. 이를 위해 Member 클래스를 추가하기로 합시다.
▶ Member.cs
namespace First_Windows_Forms
{
public class Member
{
public string Id
{
get;
private set;
}
public string Name
{
get;
private set;
}
public Member(string id, string name)
{
Id = id;
Name = name;
}
public override string ToString()
{
return Id;
}
}
}
그리고 회원 관리자를 클래스로 정의합시다. Windows Forms 응용 프로그램을 작성할 때 관리할 데이터와 Forms 사이의 관계를 느슨하게 작성하기 위함입니다. GUI 부분은 요구 사항이 자주 바꾸는 부분이므로 사용자와 상호 작용하는 부분을 변경하더라도 주요 코드는 변경하지 않게 하려면 데이터를 관리하는 부분을 별도의 클래스로 정의하세요.
특히 프로그램의 전체 데이터를 관리하는 개체는 단일 개체로 표현하여 여러 폼에서 사용하더라도 같은 데이터를 사용할 수 있게 해 주는 것은 좋은 코딩 습관이라 할 수 있습니다.
public class MemberManager
{
static MemberManager mm = new MemberManager();
public static MemberManager MM
{
get
{
return mm;
}
}
private MemberManager()
{
}
}
현재까지의 시나리오에서는 회원을 추가하는 부분과 특정 아이디의 회원 이름을 검색하는 부분만 필요합니다. 이 부분을 수행할 수 있게 MemberManager 클래스를 정의합시다. 먼저 멤버 필드로 회원 아이디를 키로 Member 개체를 값으로 하는 사전 개체를 선언합시다.
Dictionary<string, Member> mdic = new Dictionary<string, Member>();
회원 아이디와 이름을 입력 인자로 받아 회원 데이터를 추가하는 메서드를 제공합시다. 만약 이미 존재하는 아이디일 때는 거짓을 반환하고 그렇지 않을 때 회원 개체를 생성하여 보관한 후에 참을 반환합니다.
public bool AddMember(string id, string name)
{
if (mdic.ContainsKey(id))
{
return false;
}
mdic[id] = new Member(id, name);
return true;
}
그리고 회원 아이디로 회원 이름을 검색하는 메서드를 제공합시다. 입력받은 회원 ID가 존재하면 회원의 이름을 반환하고 그렇지 않으면 string.Empty를 반환합시다.
public string FindMemberName(string id)
{
if (mdic.ContainsKey(id))
{
return mdic[id].Name;
}
return string.Empty;
}
▶ MemberManager.cs
using System.Collections.Generic;
namespace First_Windows_Forms
{
public class MemberManager
{
Dictionary<string, Member> mdic = new Dictionary<string, Member>();
static MemberManager mm = new MemberManager();
public static MemberManager MM
{
get
{
return mm;
}
}
private MemberManager()
{
}
public bool AddMember(string id, string name)
{
if (mdic.ContainsKey(id))
{
return false;
}
mdic[id] = new Member(id, name);
return true;
}
public string FindMemberName(string id)
{
if (mdic.ContainsKey(id))
{
return mdic[id].Name;
}
return string.Empty;
}
}
}
MainForm에서는 회원 관리자의 단일 개체를 사용하여 사용자의 요청에 맞게 회원 데이터를 추가하거나 검색합니다. 쉽게 접근할 수 있게 MainForm.cs에 속성을 추가합시다.
private MemberManager MM
{
get
{
return MemberManager.MM;
}
}
속성 창의 이벤트 툴 버튼을 선택하여 Click 이벤트 핸들러를 추가하세요. 디자인 창의 버튼을 더블 클릭하여도 버튼의 Click 이벤트 핸들러를 자동으로 추가해 줍니다. 디자인 창에서 컨트롤을 더블 클릭하면 개발자가 기본으로 처리할 것이라 생각하는 이벤트 핸들러를 자동으로 추가해 줍니다.
private void btn_add_Click(object sender, EventArgs e)
btn_add의 클릭 이벤트 핸들러에서는 두 개의 TextBox에 입력한 정보를 얻어와서 회원 관리자 개체의 AddMember 메서드를 이용하여 추가 요청합니다. 만약 반환 값이 거짓이면 추가 실패 메시지 창을 보여주고 참이면 리스트 상자의 항목에 아이디를 추가합니다.
string id = string.Empty;
string name = string.Empty;
id = tbox_id.Text;
name = tbox_name.Text;
if (MM.AddMember(id, name) == false)
{
MessageBox.Show("추가 실패");
}
else
{
lbox_member.Items.Add(id);
}
이번에는 속성 창을 이용하여 lbox_member 컨트롤의 선택 변경 이벤트 핸들러를 추가합니다.
private void lbox_member_SelectedIndexChanged(object sender, EventArgs e)
선택한 항목의 인덱스가 -1이면 선택 항목이 없는 것이므로 메서드를 종료합니다.
if (lbox_member.SelectedIndex == -1)
{
return;
}
선택 항목을 string 형식으로 참조한 후 회원 관리자 개체를 이용하여 이름을 찾은 후에 이름을 보여줄 Label의 Text 속성을 설정합니다.
string id = lbox_member.SelectedItem as string;
lb_name2.Text = MM.FindMemberName(id);
▶ MainForm.cs
using System;
using System.Windows.Forms;
namespace First_Windows_Forms
{
public partial class MainForm : Form
{
private MemberManager MM
{
get
{
return MemberManager.MM;
}
}
public MainForm()
{
InitializeComponent();
}
private void btn_add_Click(object sender, EventArgs e)
{
string id = string.Empty;
string name = string.Empty;
id = tbox_id.Text;
name = tbox_name.Text;
if (MM.AddMember(id, name) == false)
{
MessageBox.Show("추가 실패");
}
else
{
lbox_member.Items.Add(id);
}
}
private void lbox_member_SelectedIndexChanged(object sender, EventArgs e)
{
if (lbox_member.SelectedIndex == -1)
{
return;
}
string id = lbox_member.SelectedItem as string;
lb_name2.Text = MM.FindMemberName(id);
}
}
}
1.6.2 사용자 정의 컨트롤 만들기
이번에는 사용자 정의 컨트롤을 만들고 이를 사용하는 Windows Forms 응용 프로그램을 만들어 봅시다.
실습은 도서 관리자 응용을 만드는 것으로 할게요. 도서 관리자 응용은 Windows Forms 응용 프로그램으로 사용자 정의 컨트롤인 BookControlLib와 BookLib 클래스 라이브러리를 참조합니다. 그리고 BookControlLib는 BookLib 클래스 라이브러리를 참조할 것입니다.
먼저 클래스 라이브러를 생성하여 디폴트로 제공하는 소스 파일명을 Book.cs로 변경하세요.
Book 클래스는 도서 제목, ISBN, 저자, 출판사, 설명을 멤버 속성으로 캡슐화하는 아주 작은 클래스입니다. 이에 관한 설명은 별도로 하지 않겠습니다.
▶ Book.cs
namespace BookLib
{
/// <summary>
/// 도서 클래스
/// </summary>
public class Book
{
static Book empty = new Book(string.Empty,string.Empty,
string.Empty,string.Empty,string.Empty);
/// <summary>
/// 빈 도서 정적 개체 - 가져오기
/// </summary>
public static Book Empty
{
get
{
return empty;
}
}
/// <summary>
/// ISBN - 가져오기
/// </summary>
public string ISBN
{
get;
private set;
}
/// <summary>
/// 제목 - 가져오기
/// </summary>
public string Title
{
get;
private set;
}
/// <summary>
/// 저자 - 가져오기
/// </summary>
public string Author
{
get;
private set;
}
/// <summary>
/// 설명 - 가져오기
/// </summary>
public string Description
{
get;
private set;
}
/// <summary>
/// 출판사 - 가져오기
/// </summary>
public string Publisher
{
get;
private set;
}
/// <summary>
/// 생성자
/// </summary>
/// <param name="title">제목</param>
/// <param name="isbn">ISBN</param>
/// <param name="author">저자</param>
/// <param name="publisher">출판사</param>
/// <param name="description">설명</param>
public Book(string title,string isbn,string author,string publisher,
string description)
{
Title = title;
ISBN = isbn;
Author = author;
Description = description;
Publisher = publisher;
}
/// <summary>
/// ToString 재정의 - 타이틀
/// </summary>
/// <returns></returns>
public override string ToString()
{
return Title;
}
}
}
이제 Windows Forms 컨트롤 라이브러리 형태의 프로젝트를 추가하여 BookControlLib를 만듭시다. 기본으로 제공하는 컨트롤 이름을 BookControl로 변경하세요. 그리고 도서 정보를 시각화하기 위해 자식 컨트롤을 배치합시다.
번호 | 컨트롤 이름 | 컨트롤 유형 | 설명 |
1 | lb_title_info | Label | 정보 표시 |
2 | lb_title | Label | 도서 제목 |
3 | lb_isbn_info | Label | 정보 표시 |
4 | lb_isbn | Label | ISBN |
5 | lb_author_info | Label | 정보 표시 |
6 | lb_author | Label | 저자명 |
7 | lb_publisher_info | Label | 정보 표시 |
8 | lb_publisher | Label | 출판사 |
9 | tbox_description | TextBox | 상세 설명, Multiline:True, ReadOnly:True |
[표 1.2] BookControl의 자식 컨트롤
그리고 BookLib를 참조 추가합니다.
BookControl에 도서 개체 정보를 변경할 때 이 사실을 필요로 하는 곳을 위해 이벤트 인자 형식과 대리자를 정의합시다.
▶ BookEventArgs.cs
using System;
using BookLib;
namespace BookControlLib
{
/// <summary>
/// 도서 이벤트 대리자
/// </summary>
/// <param name="sender">보낸 이</param>
/// <param name="e">이벤트 처리에 필요한 인자</param>
public delegate void BookEventHandler(object sender, BookEventArgs e);
/// <summary>
/// 도서 이벤트 인자 클래스
/// </summary>
public class BookEventArgs:EventArgs
{
/// <summary>
/// 도서 개체 - 가져오기
/// </summary>
public Book Book
{
get;
private set;
}
/// <summary>
/// 도서명 - 가져오기
/// </summary>
public string Title
{
get
{
return Book.Title;
}
}
/// <summary>
/// 저자 - 가져오기
/// </summary>
public string Author
{
get
{
return Book.Author;
}
}
/// <summary>
/// 출판사 - 가져오기
/// </summary>
public string Publisher
{
get
{
return Book.Publisher;
}
}
/// <summary>
/// 설명 - 가져오기
/// </summary>
public string Description
{
get
{
return Book.Description;
}
}
/// <summary>
/// 생성자
/// </summary>
/// <param name="book">도서 개체</param>
public BookEventArgs(Book book)
{
Book = book;
}
/// <summary>
/// ToString 재정의
/// </summary>
/// <returns>도서명</returns>
public override string ToString()
{
return Book.Title;
}
}
}
BookControl에는 도서 개체를 멤버 필드와 도서 개체 변경에 관한 이벤트를 멤버로 캡슐화합니다.
public event BookEventHandler ChangedBook = null;
Book book = Book.Empty;
그리고 도서 개체를 가져오기 및 설정하기 속성을 제공합니다. set 블록에서는 도서 변경한 사실을 통보하고 자식 컨트롤의 속성을 변경합니다.
public Book Book
{
get
{
return book;
}
set
{
if (value == null)
{
book = Book.Empty;
}
else
{
book = value;
}
if (ChangedBook != null)
{
ChangedBook(this, new BookEventArgs(Book));
}
ChangeControlProperty();
}
}
자식 속성을 변경하는 메서드에서는 각 속성이 string.Empty일 때 디폴트 값으로 설정하고 그 외에는 도서 개체의 속성을 이용하여 설정합니다.
private void ChangeControlProperty()
{
if (book.Title == string.Empty)
{
lb_title.Text = "[제목]";
}
else
{
lb_title.Text = book.Title;
}
if (book.ISBN == string.Empty)
{
lb_isbn.Text = "[ISBN]";
}
else
{
lb_isbn.Text = book.ISBN;
}
...중략...
tbox_description.Text = book.Description;
}
▶ BookControlLib.cs
using System.Windows.Forms;
using BookLib;
namespace BookControlLib
{
/// <summary>
/// 도서 컨트롤
/// </summary>
public partial class BookControl : UserControl
{
/// <summary>
/// 도서 개체 변경 이벤트
/// </summary>
public event BookEventHandler ChangedBook = null;
Book book = Book.Empty;
/// <summary>
/// 도서 개체 - 가져오기, 설정하기
/// </summary>
public Book Book
{
get
{
return book;
}
set
{
if (value == null)
{
book = Book.Empty;
}
else
{
book = value;
}
if (ChangedBook != null)
{
ChangedBook(this, new BookEventArgs(Book));
}
ChangeControlProperty();
}
}
/// <summary>
/// 생성자
/// </summary>
public BookControl()
{
InitializeComponent();
}
private void ChangeControlProperty()
{
if (book.Title == string.Empty)
{
lb_title.Text = "[제목]";
}
else
{
lb_title.Text = book.Title;
}
if (book.ISBN == string.Empty)
{
lb_isbn.Text = "[ISBN]";
}
else
{
lb_isbn.Text = book.ISBN;
}
if (book.Author == string.Empty)
{
lb_author.Text = "[저자]";
}
else
{
lb_author.Text = book.Author;
}
if (book.Publisher == string.Empty)
{
lb_publisher.Text = "[출판사]";
}
else
{
lb_publisher.Text = book.Publisher;
}
tbox_description.Text = book.Description;
}
}
}
이제 Windows Forms 응용 프로그램 형태의 도서 관리자 프로젝트를 추가합시다. 그리고 BookControlLib를 참조 추가합니다.
도서 관리자 응용에는 MainForm과 AddForm이 있고 데이터를 관리하는 BookManager 클래스를 정의할 것입니다. 먼저 디폴트로 제공하는 Form1을 MainForm으로 변경하신 후에 AddForm을 추가하세요. 그리고 BookManager 클래스를 추가합니다.
번호 | 컨트롤 이름 | 컨트롤 유형 | 설명 |
1 | btn_add | Button | 도서 추가 폼 띄우기 버튼 |
2 | lbox_book | ListBox | 도서 목록 |
3 | bc | BookControl | 도서 정보 |
[표 1.3] MainForm의 자식 컨트롤
번호 | 컨트롤 이름 | 컨트롤 유형 | 설명 |
1 | lb_title_info | Label | 정보 표시 |
2 | tbox_title | TextBox | 도서명 입력 창 |
3 | lb_isbn_info | Label | 정보 표시 |
4 | tbox_isbn | TextBox | ISBN 입력 창 |
5 | lb_author_info | Lable | 정보 표시 |
6 | tbox_author | TextBox | 저자명 입력 창 |
7 | lb_publisher_info | Label | 정보 표시 |
8 | tbox_publisher | TextBox | 출판사 입력 창 |
9 | lb_description_info | Label | 정보 표시 |
10 | tbox_description | TextBox | 설명 입력 창 |
11 | bnt_add | Button | 추가 버튼 |
12 | bnt_cancel | Button | 취소 버튼 |
[표 1.4] AddForm의 자식 컨트롤
먼저 BookManager 클래스를 구현합시다.
BookManager 개체는 단일 개체로 정의합시다.
static BookManager bm = new BookManager();
internal static BookManager BM
{
get
{
return bm;
}
}
private BookManager()
{
}
BookManager에는 도서를 추가하였을 때 이를 알고자 하는 곳에 이 사실을 알려주기 위한 이벤트를 멤버로 캡슐화합니다.
internal event BookEventHandler AddedBook = null;
그리고 ISBN을 키로하고 Book 개체를 값으로 하는 사전 개체를 두어 도서 개체를 관리합시다.
Dictionary<string, Book> bdic = new Dictionary<string, Book>();
도서를 추가하는 메서드를 제공합시다.
internal bool AddBook(string title, string isbn, string author, string publisher,
string description)
만약 입력 인자로 받은 isbn이 이미 있으면 거짓을 반환합니다.
if (bdic.ContainsKey(isbn))
{
return false;
}
입력 인자로 받은 isbn이 없으면 Book 개체를 생성하여 사전 개체에 등록합니다.
bdic[isbn] = new Book(title, isbn, author, publisher, description);
그리고 도서 개체 추가 이벤트 멤버가 null이 아니면 도서를 추가한 사실을 구독하기를 원하는 개체가 있는 것이므로 이벤트 핸들러를 수행합니다.
if (AddedBook != null)
{
AddedBook(this, new BookEventArgs(bdic[isbn]));
}
그리고 참을 반환합니다.
return true;
▶ BookManager.cs
using System.Collections.Generic;
using BookControlLib;
using BookLib;
namespace 도서관리자
{
class BookManager
{
internal event BookEventHandler AddedBook = null;
Dictionary<string, Book> bdic = new Dictionary<string, Book>();
static BookManager bm = new BookManager();
internal static BookManager BM
{
get
{
return bm;
}
}
private BookManager()
{
}
internal bool AddBook(string title, string isbn, string author,
string publisher, string description)
{
if (bdic.ContainsKey(isbn))
{
return false;
}
bdic[isbn] = new Book(title, isbn, author, publisher, description);
if (AddedBook != null)
{
AddedBook(this, new BookEventArgs(bdic[isbn]));
}
return true;
}
}
}
MainForm에서는 BookManger 개체를 자주 사용할 수 있으므로 쉽게 참조할 수 있게 속성을 정의합니다.
BookManager BM
{
get
{
return BookManager.BM;
}
}
추가 폼은 최대 하나의 폼만 띄우도록 합시다. 이를 위해 MainForm에는 추가 폼을 참조하는 멤버 필드를 선언합니다.
AddForm af = null;
MainForm의 Load 이벤트 핸들러를 추가합시다.
private void MainForm_Load(object sender, EventArgs e)
이벤트 핸들러에서는 BookManager 단일 개체에게 AddedBook 이벤트 핸들러를 등록하여 도서를 추가하였을 때 이 사실을 통보받아 처리할 수 있게 합니다.
BM.AddedBook += new BookEventHandler(BM_AddedBook);
BM_AddedBook 이벤트 핸들러에서는 도서 개체를 항목으로 추가합니다.
void BM_AddedBook(object sender, BookEventArgs e)
{
lbox_book.Items.Add(e.Book);
}
추가 버튼인 btn_add의 Click 이벤트 핸들러를 추가합시다.
private void btn_add_Click(object sender, EventArgs e)
만약 추가 폼을 참조하는 af가 null이면 추가 폼을 생성합니다. 그리고 추가 폼이 닫히는 것을 인지하기 위해 af의 FormClosed 이벤트 핸들러를 추가합니다. 그리고 추가 폼을 시각화합니다.
if (af == null)
{
af = new AddForm();
af.FormClosed += new FormClosedEventHandler(af_FormClosed);
af.Show();
}
af_FormClosed 이벤트 핸들러에서는 af를 null로 설정합니다. 이 작업으로 다시 추가 버튼을 클릭하면 추가 폼을 생성하여 시각화할 수 있는 것입니다.
void af_FormClosed(object sender, FormClosedEventArgs e)
{
af = null;
}
도서 목록 상자의 항목 변경 이벤트 핸들러를 추가합니다. 이벤트 핸들러에서는 선택한 항목의 도서 개체를 참조하여 BookControl인 bc의 Book 속성을 설정합니다.
private void lbox_book_SelectedIndexChanged(object sender, EventArgs e)
{
if (lbox_book.SelectedIndex == -1)
{
return;
}
Book book = lbox_book.SelectedItem as Book;
bc.Book = book;
}
▶ MainForms.cs
using System;
using System.Windows.Forms;
using BookControlLib;
using BookLib;
namespace 도서관리자
{
public partial class MainForm : Form
{
AddForm af = null;
BookManager BM
{
get
{
return BookManager.BM;
}
}
public MainForm()
{
InitializeComponent();
}
private void MainForm_Load(object sender, EventArgs e)
{
BM.AddedBook += new BookEventHandler(BM_AddedBook);
}
void BM_AddedBook(object sender, BookEventArgs e)
{
lbox_book.Items.Add(e.Book);
}
private void btn_add_Click(object sender, EventArgs e)
{
if (af == null)
{
af = new AddForm();
af.FormClosed += new FormClosedEventHandler(af_FormClosed);
af.Show();
}
}
void af_FormClosed(object sender, FormClosedEventArgs e)
{
af = null;
}
private void lbox_book_SelectedIndexChanged(object sender, EventArgs e)
{
if (lbox_book.SelectedIndex == -1)
{
return;
}
Book book = lbox_book.SelectedItem as Book;
bc.Book = book;
}
}
}
이제 AddForm을 구현합시다.
MainForm과 마찬가지로 BookManger를 쉽게 참조할 수 있게 속성을 정의합니다.
BookManager BM
{
get
{
return BookManager.BM;
}
}
추가 버튼의 Click 이벤트 핸들러를 추가합니다.
private void btn_add_Click(object sender, EventArgs e)
도서 정보를 입력한 컨트롤의 Text 속성으로 도서 정보를 얻어옵니다.
string title = tbox_title.Text;
string isbn = tbox_isbn.Text;
string author = tbox_author.Text;
string publisher = tbox_publisher.Text;
string description = tbox_description.Text;
도서 관리자 단일 개체의 AddBook 메서드를 이용하여 도서 정보를 추가합니다. 만약 결과가 false이면 메시지 창으로 추가 실패를 통보합니다.
if (BM.AddBook(title, isbn, author, publisher, description) == false)
{
MessageBox.Show("추가 실패");
}
마지막으로 컨트롤의 Text 속성을 초기화합니다.
ControlTextInitialize();
도서 정보를 입력하는 TextBox 컨트롤들의 Text 속성을 초기화하는 메서드를 추가합니다.
private void ControlTextInitialize()
{
tbox_title.Text = string.Empty;
tbox_author.Text = string.Empty;
tbox_isbn.Text = string.Empty;
tbox_publisher.Text = string.Empty;
tbox_description.Text = string.Empty;
}
취소 버튼의 Click 이벤트 핸들러도 추가하여 ControlTextInitialize 메서드를 호출합니다.
private void btn_cancel_Click(object sender, EventArgs e)
{
ControlTextInitialize();
}
이상으로 사용자 정의 컨트롤을 정의하고 이를 이용하는 Windows Forms 응용을 만들어 보았습니다. Windows Forms 응용을 만드는 기술 학습으로는 많은 부분에서 부족할 수 있지만 기본적인 사항을 소개하는 수준에서 끝낼게요. 앞으로 검색 엔진을 만드는 과정을 소개하면서 보다 다양한 실습을 할 수 있을 것입니다. 그리고 필요하시면 별도의 레퍼런스를 참고하시기 바랍니다.
▶ AddForm.cs
using System;
using System.Windows.Forms;
namespace 도서관리자
{
public partial class AddForm : Form
{
BookManager BM
{
get
{
return BookManager.BM;
}
}
public AddForm()
{
InitializeComponent();
}
private void btn_add_Click(object sender, EventArgs e)
{
string title = tbox_title.Text;
string isbn = tbox_isbn.Text;
string author = tbox_author.Text;
string publisher = tbox_publisher.Text;
string description = tbox_description.Text;
if (BM.AddBook(title, isbn, author, publisher, description) == false)
{
MessageBox.Show("추가 실패");
}
ControlTextInitialize();
}
private void ControlTextInitialize()
{
tbox_title.Text = string.Empty;
tbox_author.Text = string.Empty;
tbox_isbn.Text = string.Empty;
tbox_publisher.Text = string.Empty;
tbox_description.Text = string.Empty;
}
private void btn_cancel_Click(object sender, EventArgs e)
{
ControlTextInitialize();
}
}
}
언제나휴일 여행 및 산책
'프로젝트 > 웹 검색엔진 만들기' 카테고리의 다른 글
1. 5 라이브러리 (0) | 2025.01.19 |
---|---|
1. 4 요구 기술 (0) | 2025.01.19 |
1. 3 시나리오 (1) | 2025.01.19 |
1. 2 개요 (1) | 2025.01.19 |
1. 1 검색 엔진 (0) | 2025.01.19 |
1. 검색 엔진 소개 및 개요 (0) | 2025.01.19 |
0. 들어가기에 앞서 (0) | 2025.01.19 |