[Windows Forms 응용 with C#] 2.3 ComboBox, ListBox, CheckListBox 사용 실습

이번에는 ComboBox, ListBox, CheckListBox 컨트롤의 사용법을 알아봅시다. 이들 컨트롤은 Items 컬렉션 속성을 갖고 있어 요소 개체를 보관하고 이들의 정보를 화면에 표시하는 역할을 수행합니다.

우리는 이들 컨트롤에 요소를 추가하거나 삭제할 수 있고 선택 항목을 변경하였을 때 이에 관한 이벤트 처리를 하는 방법을 살펴볼 것입니다. 그리고 프로그램 방식으로 전체 요소의 개수를 알아내고 선택 항목이 무엇인지 확인하는 작업을 수행할 것입니다. 특히 CheckListBox 컨트롤은 요소 항목이 Checked 상태인지 여부도 확인할 수 있습니다.

[그림 2.5] 실행화면

 콤보 박스는 텍스트 박스처럼 입력도 할 수 있습니다. 여기서는 콤보 박스에 텍스트를 입력한 후 추가 버튼을 누르면 콤보 박스 항목에 추가합니다. 삭제 버튼을 누르면 선택 항목을 삭제합니다. 그리고 추가하거나 삭제 및 선택 항목이 바뀌면 실시간으로 맨 아래에 있는 Label 컨트롤에 메시지를 표시합니다.

리스트 박스와 체크 리스트 박스도 콤보 박스와 비슷하게 처리할 것입니다. 다른 점은 항목을 추가하기 위한 별도의 텍스트 상자가 있다는 점입니다.

마지막으로 요약 버튼을 클릭하면 각 박스의 항목 개수와 선택 항목을 리스트 박스에 항목 추가합니다. 그리고 체크 리스트 박스에 체크 상태의 항목들도 추가합니다.

[그림 2.6] 컨트롤 배치

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

NoName컨트롤 형식설명
1cboxComboBox콤보 박스
2btn_add1Button콤보 박스에 항목 추가
3btn_remove1Button콤보 박스의 선택 항목 삭제
4tbox_1TextBox리스트 박스에 추가할 Text
5btn_add2Button리스트 박스에 항목 추가
6lbox_1ListBox리스트 박스
7btn_remove2Button리스트 박스의 선택 항목 삭제
8tbox_2TextBox체크 리스트 박스에 추가할 Text
9btn_add3Button체크 리스트 박스에 항목 추가
10chboxCheckListBox체크 리스트 박스
11bnt_remove3Button체크 리스트 박스의 선택 항목 삭제
12btn_summaryButton전체 요약
13lbox_2ListBox요약 정보 표시할 리스트 박스
14lb_msgLabel사건 변화를 표시할 Label

콤보 박스에 항목을 추가하는 btn_add1 컨트롤의 클릭 이벤트 핸드러를 등록하세요.

private void btn_add1_Click(object sender, EventArgs e)
{

콤보 박스에 입력한 문자열은 Text 속성으로 가져오기 할 수 있습니다. 이를 콤보 박스의 항목을 보관하는 Items 컬렉션 속성에 추가합니다.

    cbox.Items.Add(cbox.Text);

그리고 메시지를 표시할 lb_msg의 Text 속성에 정보를 설정하고 cbox의 Text 속성을 빈 문자열로 설정합니다.

    lb_msg.Text = string.Format("콤보 박스 항목 추가 {0}", cbox.Text);
    cbox.Text = string.Empty;
}

cbox의 선택 항목 변경 이벤트 핸들러를 등록합니다.

private void cbox_SelectedIndexChanged(object sender, EventArgs e)
{

선택 항목의 인덱스는 SelectedIndex 속성으로 가져오기 할 수 있습니다. 만약 이 값이 -1이면 선택 항목이 없는 것입니다.

    string msg;
    if (cbox.SelectedIndex == -1)
    {
        msg = string.Format("체크 박스 선택 항목이 없습니다.");
    }
    else
    {

선택 항목은 SelectedItem으로 참조할 수 있습니다.

        string str = cbox.SelectedItem as string;
        msg = string.Format("체크 박스 선택 항목 변경, 인덱스:{0} Text:{1}",
                cbox.SelectedIndex, str);
    }
    lb_msg.Text = msg;
}

콤보 박스의 선택 항목을 삭제하는 버튼의 클릭 이벤트 핸들러를 등록합니다.

private void btn_remove1_Click(object sender, EventArgs e)
{

선택 항목이 없으면 이벤트 핸들러를 종료합니다.

    if (cbox.SelectedIndex == -1)
    {
        return;
    }

선택 항목의 정보를 가져와 메시지 문자열을 만듭니다.

    string str = cbox.SelectedItem as string;
   string msg = string.Format("체크 박스 선택 항목 삭제, 인덱스:{0} Text:{1}",
                              cbox.SelectedIndex, str);

그리고 콤보 박스의 Items 컬렉션 속성의 RemoveAt 메서드를 이용하여 선택 항목인덱스를 전달해 항목을 삭제합니다.

    cbox.Items.RemoveAt(cbox.SelectedIndex);
    lb_msg.Text = msg;
    cbox.Text = string.Empty;
}

리스트 박스 사용법은 콤보 박스 사용법과 매우 흡사합니다. 먼저 리스트 박스에 항목을 추가하는 버튼의 클릭 이벤트 핸들러를 등록하여 작성하세요.

private void btn_add2_Click(object sender, EventArgs e)
{
    lbox_1.Items.Add(tbox_1.Text);
    lb_msg.Text = string.Format("리스트 박스 항목 추가 {0}", tbox_1.Text);
    tbox_1.Text = string.Empty;
}

리스트 박스의 선택 항목을 삭제하는 버튼의 클릭 이벤트 핸들러도 등록하여 구현합시다.

private void btn_remove2_Click(object sender, EventArgs e)
{
    if (lbox_1.SelectedIndex == -1)
    {
        return;
    }
    string str = lbox_1.SelectedItem as string;
    string msg = string.Format("리스트 박스 선택 항목 삭제, 인덱스:{0} Text:{1}",
                               lbox_1.SelectedIndex, str);
    lbox_1.Items.RemoveAt(lbox_1.SelectedIndex);
    lb_msg.Text = msg;
}

리스트 박스의 선택 항목 변경 이벤트 핸들로도 등록하여 구현합시다.

private void lbox_1_SelectedIndexChanged(object sender, EventArgs e)
{
    string msg;
    if (lbox_1.SelectedIndex == -1)
    {
        msg = string.Format("리스트 박스 선택 항목이 없습니다.");
    }
    else
    {
        string str = lbox_1.SelectedItem as string;
        msg = string.Format("리스트 박스 선택 항목 변경, 인덱스:{0} Text:{1}",
                            lbox_1.SelectedIndex, str);
    }
    lb_msg.Text = msg;
}

체크 리스트 박스에 항목을 추가하는 부분도 크게 다르지 않습니다.

private void btn_add3_Click(object sender, EventArgs e)
{
    chbox.Items.Add(tbox_2.Text);
    lb_msg.Text = string.Format("체크 리스트 박스 항목 추가 {0}", tbox_2.Text);
    tbox_2.Text = string.Empty;
}

체크 리스트 박스에 항목을 삭제하는 부분도 구현합시다.

private void btn_remove3_Click(object sender, EventArgs e)
{
    if (chbox.SelectedIndex == -1)
    {
        return;
    }
    string str = chbox.SelectedItem as string;
    string msg = string.Format(
                    "체크 리스트 박스 선택 항목 삭제, 인덱스:{0} Text:{1}",
                    chbox.SelectedIndex, str);
    chbox.Items.RemoveAt(chbox.SelectedIndex);
    lb_msg.Text = msg;
}

체크 리스트 박스의 선택 항목 변경 이벤트 핸들러도 등록하여 구현하세요.

private void chbox_SelectedIndexChanged(object sender, EventArgs e)
{
    string msg;
    if (chbox.SelectedIndex == -1)
    {
        msg = string.Format("체크 리스트 박스 선택 항목이 없습니다.");
    }
    else
    {
        string str = chbox.SelectedItem as string;
        msg = string.Format("체크 리스트 박스 선택 항목 변경, 인덱스:{0} Text:{1}",
                            chbox.SelectedIndex, str);
    }
    lb_msg.Text = msg;
}

마지막으로 요약 버튼 클릭 이벤트 핸들러를 등록하여 구현합시다.

private void btn_summary_Click(object sender, EventArgs e)
{

먼저 요약 정보를 표시할 리스트 박스의 항목을 지웁니다.

    lbox_2.Items.Clear();

그리고 각 박스의 항목 개수와 선택 항목을 추가합니다.

    string str;
    str = string.Format("콤보 박스 항목 개수:{0}", cbox.Items.Count);
    lbox_2.Items.Add(str);
    str = string.Format("콤보 박스 선택 항목:{0}", cbox.SelectedIndex);
    lbox_2.Items.Add(str);
    string.Format("리스트 박스 항목 개수:{0}", lbox_1.Items.Count);
    lbox_2.Items.Add(str);
    str = string.Format("리스트 박스 선택 항목:{0}", lbox_1.SelectedIndex);
    lbox_2.Items.Add(str);
    string.Format("체크 리스트 박스 항목 개수:{0}", chbox.Items.Count);
    lbox_2.Items.Add(str);
    str = string.Format("체크 리스트 박스 선택 항목:{0}", chbox.SelectedIndex);
    lbox_2.Items.Add(str);

체크 리스트 박스의 체크 상태의 항목은 CheckedItems 컬렉션 속성에 있습니다. 이를 이용하여 선택 항목들을 순차적으로 추가하세요.

    str = string.Format("체크 리스트 박스 체크 상태 목록");
    lbox_2.Items.Add(str);
    foreach (object obj in chbox.CheckedItems)
    {
        lbox_2.Items.Add(obj);
    }
}

이제 빌드한 후에 확인해 보세요.

▷Form1.cs

using System;
using System.Windows.Forms;
namespace Ex_ComboBox_ListBox_CHeckListBox
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void btn_add1_Click(object sender, EventArgs e)
        {
            cbox.Items.Add(cbox.Text);
            lb_msg.Text = string.Format("콤보 박스 항목 추가 {0}", cbox.Text);
            cbox.Text = string.Empty;
        }
        private void cbox_SelectedIndexChanged(object sender, EventArgs e)
        {
            string msg;
            if (cbox.SelectedIndex == -1)
            {
                msg = string.Format("체크 박스 선택 항목이 없습니다.");
            }
            else
            {
                string str = cbox.SelectedItem as string;
                msg = string.Format("체크 박스 선택 항목 변경, 인덱스:{0} Text:{1}",
                    cbox.SelectedIndex, str);
            }
            lb_msg.Text = msg;
        }
        private void btn_remove1_Click(object sender, EventArgs e)
        {
            if (cbox.SelectedIndex == -1)
            {
                return;
            }
            string str = cbox.SelectedItem as string;
            string msg = string.Format("체크 박스 항목 삭제 인덱스:{0}Text:{1}",
                                       cbox.SelectedIndex, str);
            cbox.Items.RemoveAt(cbox.SelectedIndex);
            lb_msg.Text = msg;
            cbox.Text = string.Empty;
        }
        private void btn_add2_Click(object sender, EventArgs e)
        {
            lbox_1.Items.Add(tbox_1.Text);
            lb_msg.Text = string.Format("리스트 박스 항목 추가 {0}", tbox_1.Text);
            tbox_1.Text = string.Empty;
        }
        private void btn_remove2_Click(object sender, EventArgs e)
        {
            if (lbox_1.SelectedIndex == -1)
            {
                return;
            }
            string str = lbox_1.SelectedItem as string;
            string msg = string.Format("리스트 박스 항목 삭제, 인덱스:{0} Text:{1}",
                                       lbox_1.SelectedIndex, str);
            lbox_1.Items.RemoveAt(lbox_1.SelectedIndex);
            lb_msg.Text = msg;
        }
        private void lbox_1_SelectedIndexChanged(object sender, EventArgs e)
        {
            string msg;
            if (lbox_1.SelectedIndex == -1)
            {
                msg = string.Format("리스트 박스 선택 항목이 없습니다.");
            }
            else
            {
                string str = lbox_1.SelectedItem as string;
                msg = string.Format("리스트 박스 선택 항목 변경 인덱스:{0} Text:{1}",
                                    lbox_1.SelectedIndex, str);
            }
            lb_msg.Text = msg;
        }

        private void btn_add3_Click(object sender, EventArgs e)
        {
            chbox.Items.Add(tbox_2.Text);
            lb_msg.Text = string.Format(
                              "체크 리스트 박스 항목 추가 {0}", tbox_2.Text);
            tbox_2.Text = string.Empty;
        }
        private void btn_remove3_Click(object sender, EventArgs e)
        {
            if (chbox.SelectedIndex == -1)
            {
                return;
            }
            string str = chbox.SelectedItem as string;
            string msg = string.Format(
               "체크 리스트 박스 선택 항목 삭제, 인덱스:{0} Text:{1}",
                chbox.SelectedIndex, str);
            chbox.Items.RemoveAt(chbox.SelectedIndex);
            lb_msg.Text = msg;
        }
        private void chbox_SelectedIndexChanged(object sender, EventArgs e)
        {
            string msg;
            if (chbox.SelectedIndex == -1)
            {
                msg = string.Format("체크 리스트 박스 선택 항목이 없습니다.");
            }
            else
            {
                string str = chbox.SelectedItem as string;
                msg = string.Format(
                                "체크 리스트 박스 선택 항목 변경, 인덱스:{0} Text:{1}",
                                chbox.SelectedIndex, str);
            }
            lb_msg.Text = msg;
        }
        private void btn_summary_Click(object sender, EventArgs e)
        {
            lbox_2.Items.Clear();
            string str;
            str = string.Format("콤보 박스 항목 개수:{0}", cbox.Items.Count);
            lbox_2.Items.Add(str);
            str = string.Format("콤보 박스 선택 항목:{0}", cbox.SelectedIndex);
            lbox_2.Items.Add(str);
            string.Format("리스트 박스 항목 개수:{0}", lbox_1.Items.Count);
            lbox_2.Items.Add(str);
            str = string.Format("리스트 박스 선택 항목:{0}", lbox_1.SelectedIndex);
            lbox_2.Items.Add(str);
            string.Format("체크 리스트 박스 항목 개수:{0}", chbox.Items.Count);
            lbox_2.Items.Add(str);
            str = string.Format("체크 리스트 박스 선택 항목:{0}",
                                 chbox.SelectedIndex);
            lbox_2.Items.Add(str);

            str = string.Format("체크 리스트 박스 체크 상태 목록");
            lbox_2.Items.Add(str);
            foreach (object obj in chbox.CheckedItems)
            {
                lbox_2.Items.Add(obj);
            }
        } 
    }
}