[Windows Forms 응용 with C#] 4.4.2 도서 정보 수정 Form 구현

프로젝트에 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);
        }
    }
}