1.6.1 간단한 Windows Forms 응용 만들기

이제 간단하게 아이디와 이름을 입력받아 리스트 상자의 항목에 아이디를 추가하고 이를 항목을 선택하면 선택한 항목의 이름을 레이블 컨트롤의 속성을 이용하여 변화하는 간단한 프로그램을 작성해 봅시다. 먼저 MainForm에 자식 컨트롤을 배치합니다.

MainForm에 자식 컨트롤 배치
[그림 1.21] MainForm에 자식 컨트롤 배치
[표 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);
        }
    }
}