[카테고리:] <span>Windows Forms 응용</span>

이제 사용자와 상호작용하는 폼을 구현합시다.

프로젝트에 RegForm을 추가하고 자식 컨트롤을 배치합니다.

정보를 표시하는 Label 컨트롤을 제외하고 9개의 컨트롤을 배치합니다. 일련 번호를 표시할 Label, 제목과 내용을 입력할 TextBox, 제출과 취소와 이미지 선택을 위한 버튼, 선택한 이미지를 표시할 PictureBox, 날짜를 선택하는 DateTimePicker와 MonthCalendar입니다.

[그림 4.6] RegForm 자식 컨트롤 배치

 다음은 RegForm의 자식 컨트롤의 Name 및 형식입니다.

NoName컨트롤 형식설명
1lb_noLabel도서 일련 번호
2tbox_titleTextBox제목
3tbox_descriptionTextBox설명
4btn_submitButton도서 등록
5btn_cancelButton취소
6pb_imagePictureBox이미지 (SizeMode: StretchImage)
7btn_imageButton이미지 선택
8dtp_dateDateTimePicker날짜 선택 및 표시
9mc_dateMonthCalendar날짜 선택 및 표시

디폴트로 표시할 이미지를 리소스에 추가하세요. 여기에서는 default.jpg 파일명의 이미지를 리소스에 추가하였습니다.

이미지 개체를 위해 멤버 필드를 선언합니다.

Image bm;

도서 관리자 개체를 참조하기 쉽게 속성을 정의합니다.

BookManager BM
{
    get
    {

BookManager 클래스의 정적 멤버 BM을 그대로 By Pass 합니다.

        return BookManager.BM;
    }
}

이미지 이름을 위해 멤버 필드를 선언합니다.

string imagename;

속성 창을 이용해서 RegForm의 Load 이벤트 핸들러를 등록하세요.

private void RegForm_Load(object sender, EventArgs e)
{

디폴트 이미지로 PictureBox의 이미지를 설정합니다.

        pb_image.ImageLocation = @"Resources\default.jpg";

디폴트 이미지를 bm에 설정합니다.

    bm = pb_image.Image;

도서 관리자 개체를 통해 추가할 때 사용할 일련 번호를 구하여 일련 번호를 표시할 Label의 Text 속성을 설정합니다.

    int no = BM.NextBSNo();
    lb_no.Text = no.ToString();
}

이미지 버튼의 클릭 이벤트 핸들러를 등록합니다. 앞으로 컨트롤의 이벤트 핸들러를 등록하는 것은 속성 창을 이용하세요. 단순히 코드를 따라 친다고 동작하지 않습니다.

private void btn_image_Click(object sender, EventArgs e)
{

파일을 선택할 수 있게 파일 열기 대화 상자를 만들어 ShowDialog 메서드를 호출합니다.

    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Filter = "jpeg파일(*.jpg)|*.jpg|모든파일|*";
    if (ofd.ShowDialog() == DialogResult.OK)
    {

선택한 파일 이름으로 pb_image 컨트롤의 ImageLocation 속성을 설정합니다.

        imagename = ofd.FileName;
        pb_image.ImageLocation = imagename;
    }
}

제출 버튼의 클릭 이벤트 핸들러를 등록합니다.

private void btn_submit_Click(object sender, EventArgs e)
{

입력한 정보를 얻어옵니다.

    string title = tbox_title.Text;
    string description = tbox_description.Text;
    int no = int.Parse(lb_no.Text);
    DateTime dt = dtp_date.Value;

도서 관리자 개체의 AddBook 메서드를 호출합니다.  만약 추가 실패하면 메시지 창을 띄워 사용자에게 알려줍니다.

    if (BM.AddBook(title, description, no, imagename, dt) == false)
    {
        MessageBox.Show("이미 존재합니다.");
    }

도서 관리자 개체에게 다음에 추가할 도서 일련 번호를 확인하여 일련 번호를 표시할 Label 컨트롤의 Text 속성을 설정합니다.

    no = BM.NextBSNo();
    lb_no.Text = no.ToString();

다른 속성을 리셋합니다.

    tbox_title.Text = tbox_description.Text = string.Empty;
    pb_image.Image = bm;
}

MonthCalendar 컨트롤의 DateChanged 이벤트 핸들러를 등록합니다.

private void mc_date_DateChanged(object sender, DateRangeEventArgs e)
{

인자로 받은 값의 Start 속성으로 DateTimePicker 컨트롤의 Value 속성을 설정합니다.

    dtp_date.Value = e.Start;
}

DateTimePicker 컨트롤의 ValueChanged 이벤트 핸들러를 등록합니다.

private void dtp_date_ValueChanged(object sender, EventArgs e)
{

MonthCalendar 컨트롤의 SetData 메서드를 호출하여 날짜를 설정합니다.

    mc_date.SetDate(dtp_date.Value);
}

▷ RegForm1.cs

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
namespace MyReadingStory
{
    /// <summary>
    /// 등록 폼
    /// </summary>
    public partial class RegForm : Form
    {
        Image bm;
        BookManager BM
        {
            get
            {
                return BookManager.BM;
            }
        }
        string imagename;        
        /// <summary>
        /// 생성자
        /// </summary>
        public RegForm()
        {
            InitializeComponent();
        }
        private void RegForm_Load(object sender, EventArgs e)
        {            
            pb_image.ImageLocation = @"Resources\default.jpg";
            bm = pb_image.Image;
            int no = BM.NextBSNo();
            lb_no.Text = no.ToString();
        }
        private void btn_image_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "jpeg파일(*.jpg)|*.jpg|모든파일|*";
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                imagename = ofd.FileName;
                pb_image.ImageLocation = imagename;
            }
        }
        private void btn_submit_Click(object sender, EventArgs e)
        {
            string title = tbox_title.Text;
            string description = tbox_description.Text;
            int no = int.Parse(lb_no.Text);
            DateTime dt = dtp_date.Value;
            if (BM.AddBook(title, description, no, imagename, dt) == false)
            {
                MessageBox.Show("이미 존재합니다.");
            }
            no = BM.NextBSNo();
            lb_no.Text = no.ToString();
            tbox_title.Text = tbox_description.Text = string.Empty;            
            pb_image.Image = bm;
        }
        private void mc_date_DateChanged(object sender, DateRangeEventArgs e)
        {
            dtp_date.Value = e.Start;
        }
        private void dtp_date_ValueChanged(object sender, EventArgs e)
        {
            mc_date.SetDate(dtp_date.Value);
        }
    }
}

Windows Forms 응용