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

프로젝트에 ModifyForm을 추가하고 자식 컨트롤을 배치합니다. ModifyForm에는 도서 목록을 항목으로 표시하는 ListView 컨트롤과 선택한 도서의 정보를 표시할 컨트롤로 PictureBox 컨트롤, DateTimePicker 컨트롤 TextBox 컨트롤을 배치합니다. 그리고 이미지를 변경할 때와 변경 및 취소할 때 사용할 Button 컨트롤을 배치합니다.

[그림 4.7] ModifyForm 자식 컨트롤 배치

 다음은 ModifyForm의 자식 컨트롤 Name과 형식입니다.

NoName컨트롤 형식설명
1lv_diaryListView도서 목록(View: Details)
2pb_imagePictureBox이미지(SizeMode: StretchImage)
3btn_imageButton이미지 선택
4dtp_dateDateTimePicker날짜 선택 및 표시
5tbox_descriptionTextBox설명
6btn_submitButton변경 요청
7btn_cancelButton취소 요청

디폴트 이미지 파일명을 상수로 정의하세요.

const string def_imagename = @"Resources\default.jpg";

이미지 이름 멤버를 선언하고 디폴트 이미지 이름으로 초기화합니다.

string imagename = def_imagename;

도서 관리자 단일체를 사용하기 편하게 속성을 정의합니다.

BookManager BM
{
    get
    {

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

        return BookManager.BM;
    }
}

ModifyForm의 Load 이벤트 핸들러를 등록합니다.

private void ModifyForm_Load(object sender, EventArgs e)
{

pb_image의 ImageLocation 속성을 디폴트 이미지 파일명으로 설정합니다.

    pb_image.ImageLocation = def_imagename;

도서 관리자 개체에게 도서 목록을 요청합니다. 그리고 도서 목록을 순차적으로 ListView에 추가합니다.

    List<BookStory> bsl = BM.GetBSCollection();

    foreach (BookStory bs in bsl)
    {

도서 일련 번호와 제목으로 문자열 배열을 만들고 이를 인자로 ListViewItem 개체를 생성합니다.

        string[] subitems = new string[] { bs.No.ToString(), bs.Title };
        ListViewItem lvi = new ListViewItem(subitems);

리스트 항목으로 생성한 ListViewItem 개체를 추가합니다.

        lv_diary.Items.Add(lvi);

항목을 선택했을 때 도서 개체를 쉽게 참조할 수 있게 ListViewItem 개체의 Tag 속성에 설정합니다.

        lvi.Tag = bs;
    }
}

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

private void btn_image_Click(object sender, EventArgs e)
{

파일 열기 대화 상자를 열거 선택한 이미지로 설정합니다. 이 부분은 RegForm에서 했던 작업과 일치합니다.

    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Filter = "jpec 파일|*.jpg";
    if (ofd.ShowDialog() == DialogResult.OK)
    {
        imagename = ofd.FileName;
        pb_image.ImageLocation = imagename;
    }
}

리스트 뷰의 SelectedIndexChanged 이벤트 핸들러를 등록합니다.

private void lv_diary_SelectedIndexChanged(object sender, EventArgs e)
{

선택 항목의 개수가 0이면 이벤트 핸들러를 종료합니다.

    if (lv_diary.SelectedItems.Count == 0)
    {
        return;
    }

선택한 ListViewItem의 Tag 속성을 BookStory 형식 개체를 참조합니다.

    BookStory bs = lv_diary.SelectedItems[0].Tag as BookStory;

선택한 도서 개체로 컨트롤의 속성을 설정합니다.

    tbox_description.Text =bs.Description;
    pb_image.ImageLocation = bs.ImageName;
    dtp_date.Value = bs.DT;
}

제출 버튼의 Click 이벤트 핸들러를 등록하세요.

private void btn_submit_Click(object sender, EventArgs e)
{

선택 항목의 개수가 0이면 이벤트 핸들러를 종료합니다.

    if (lv_diary.SelectedItems.Count == 0)
    {
        return;
    }

선택한 ListViewItem의 Tag 속성을 BookStory 형식 개체를 참조합니다.

    BookStory bs = lv_diary.SelectedItems[0].Tag as BookStory;

도서 정보에 관한 컨트롤의 속성을 얻어와서 도서 관리자 개체에게 정보 변경을 요청합니다.

    string description = tbox_description.Text;
    DateTime dt = dtp_date.Value;
    BM.ModifyBS(bs.No, description,imagename,dt);
}

▷ ModifyForm.cs

using System;
using System.Collections.Generic;
using System.Windows.Forms;

namespace MyReadingStory
{
    /// <summary>
    /// 변경하기 폼
    /// </summary>
    public partial class ModifyForm : Form
    {
        const string def_imagename = @"Resources\default.jpg";
        string imagename = def_imagename;

        BookManager BM
        {
            get
            {
                return BookManager.BM;
            }
        }

        /// <summary>
        /// 생성자
        /// </summary>
        public ModifyForm()
        {
            InitializeComponent();
        }


        private void ModifyForm_Load(object sender, EventArgs e)
        {
            pb_image.ImageLocation = def_imagename;
            List<BookStory> bsl = BM.GetBSCollection();

            foreach (BookStory bs in bsl)
            {
                string[] subitems = new string[] { bs.No.ToString(), bs.Title };
                ListViewItem lvi = new ListViewItem(subitems);
                lv_diary.Items.Add(lvi);
                lvi.Tag = bs;
            }
        }

        private void btn_image_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.Filter = "jpec 파일|*.jpg";

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                imagename = ofd.FileName;
                pb_image.ImageLocation = imagename;
            }
        }
        private void lv_diary_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lv_diary.SelectedItems.Count == 0)
            {
                return;
            }
            BookStory bs = lv_diary.SelectedItems[0].Tag as BookStory;
            tbox_description.Text =bs.Description;
            pb_image.ImageLocation = bs.ImageName;
            dtp_date.Value = bs.DT;            
        }

        private void btn_submit_Click(object sender, EventArgs e)
        {
            if (lv_diary.SelectedItems.Count == 0)
            {
                return;
            }

            BookStory bs = lv_diary.SelectedItems[0].Tag as BookStory;
            string description = tbox_description.Text;
            DateTime dt = dtp_date.Value;
            BM.ModifyBS(bs.No, description,imagename,dt);
        }
    }
}

Windows Forms 응용