본문 바로가기
개발 이야기/C# 이야기

C# Listview 컬럼형식으로 사용하기(Listview 선택)

by 런던살자 2019. 6. 20.

안녕하세요 마블랑입니다.

 

마블랑은 이전에 MFC를 해서 그런지 리스트 형식의 데이터는 ListControl로 다루는 것이 익숙해져있습니다.

 

찾아보니 C#에도 그것과 비슷한 ListView가 있어 적응하기 쉬웠습니다.

 

 

간단한 샘플을 통해 C#의 Listview를 사용해보도록 하겠습니다.

 

ListView의 가장 큰 기능은 데이터를 표시하고 선택을 하는 기능이기 때문에 해당기능 위주로 샘플을 작성하였습니다.

 

전체 코드를 첨부합니다. 

 

using System;
using System.Windows.Forms;

namespace WindowsForms_Test_001
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            listView.View = View.Details;           //컬럼형식으로 변경

            listView.FullRowSelect = true;          //Row 전체 선택

            listView.Columns.Add("No", 120);        //컬럼추가
            listView.Columns.Add("ID", 100);
            listView.Columns.Add("Name", 100);
            listView.Columns.Add("Addess", 170);

            DataAddToList();
        }

        private void DataAddToList()
        {
            listView.BeginUpdate();

            ListViewItem lvi1 = new ListViewItem("1");
            lvi1.SubItems.Add("user01");
            lvi1.SubItems.Add("사용자01");
            lvi1.SubItems.Add("서울시 은평구");
            lvi1.ImageIndex = 0;
            listView.Items.Add(lvi1);

            ListViewItem lvi2 = new ListViewItem("2");
            lvi2.SubItems.Add("Temp1");
            lvi2.SubItems.Add("임시1");
            lvi2.SubItems.Add("인천광역시 부평구");
            lvi2.ImageIndex = 0;
            listView.Items.Add(lvi2);

            ListViewItem lvi3 = new ListViewItem("3");
            lvi3.SubItems.Add("Tester1");
            lvi3.SubItems.Add("테스터1");
            lvi3.SubItems.Add("성남시 분당구");
            lvi3.ImageIndex = 0;
            listView.Items.Add(lvi3);

            listView.EndUpdate();
        }

        private void ListView_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listView.SelectedItems.Count > 0)
            {
                tb_selectedIdx.Text = listView.SelectedItems[0].Index.ToString();
                tb_no.Text = listView.Items[listView.SelectedItems[0].Index].SubItems[0].Text;
                tb_id.Text = listView.Items[listView.SelectedItems[0].Index].SubItems[1].Text;
                tb_name.Text = listView.Items[listView.SelectedItems[0].Index].SubItems[2].Text;
                tb_address.Text = listView.Items[listView.SelectedItems[0].Index].SubItems[3].Text;
            }
        }

        private void Bt_select_Click(object sender, EventArgs e)
        {
            if (listView.SelectedItems.Count > 0)  
            {
                tb_selectedIdx.Text = listView.SelectedItems[0].Index.ToString();
                tb_no.Text = listView.Items[listView.SelectedItems[0].Index].SubItems[0].Text;
                tb_id.Text = listView.Items[listView.SelectedItems[0].Index].SubItems[1].Text;
                tb_name.Text = listView.Items[listView.SelectedItems[0].Index].SubItems[2].Text;
                tb_address.Text = listView.Items[listView.SelectedItems[0].Index].SubItems[3].Text;
            }
        }

        private void Bt_focus_Click(object sender, EventArgs e)
        {
            tb_selectedIdx.Text = listView.FocusedItem.Index.ToString();
            tb_no.Text = listView.Items[listView.FocusedItem.Index].SubItems[0].Text;
            tb_id.Text = listView.Items[listView.FocusedItem.Index].SubItems[1].Text;
            tb_name.Text = listView.Items[listView.FocusedItem.Index].SubItems[2].Text;
            tb_address.Text = listView.Items[listView.FocusedItem.Index].SubItems[3].Text;
        }
    }
}

 

코드에 대해 설명을 하면 

 

Form1_Load 함수에서 샘플을 위한 Listview를 설정하고 데이터를 삽입하였습니다.

 

DataAddToList()는 데이터를 삽입하기 위한 임시 함수 입니다.

 

 

Listview을 사용할 준비를 마쳤으면 이제 이벤트를 등록하겠습니다.

 

버튼과 ListView_SelectedIndexChanged 이벤트를 통해 화면 우측의 텍스트 박스에 선택한 Row의 데이터가 표시됩니다.

 

 

 

Listview의 인덱스를 선택하는 방법은 두가지 있습니다. 바로 SelcSelectedItems.Index 와 FocusedItem.Index 인데요

 

이 두개는 약간의 차이점을 가지고 있습니다.

 

SelcSelectedItems.Index는 여러개를 선택했을때 데이터 처리가 가능하고 선택을 하지 않으면 에러가 발생합니다. (Listview 선택 된것이 눈에 보여야 합니다. 모든 윈도우가 그런지는 모르겠지만 선택했을때 파란색으로 변하는 영역이 하나이상은 있어야하죠) 

 

그래서 샘플코드를 보면 Count에 대한 에러처리를 해두었습니다.

 

 

FocusedItem.Index 는 처음 실행하면 기본 0으로 설정이 됩니다.

 

화면에는 표시가 되지 않고 바로 사용하여도 기본값이 있으므로 에러가 발생하지 않습니다.

 

하지만 FocusedItem.Index는 여러개의 처리가 불가능하고 하나의 처리만 가능합니다.

 

샘플 코드를 참고하여 알맞은 곳에 사용하시기 바랍니다.

 

 

 

이제 Listview의 아이템을 선택하는 부분에 대해서 알아보겠습니다.

 

listView.Items[RowIndex].SubItems[ColumnIndex].Text;

 

색이 칠한 부분에 해당되는 행과 열의 인덱스를 넣으면 인덱스에 맞는 데이터를 불러올수 있습니다.

 

 

 

C#을 통해 데이터를 처리하는 프로그램을 구현할때 개인적으로 GridView 보다는 더 좋다고 생각합니다. 

 

그럼 마블랑이었습니다. 읽어주셔서 고맙습니다.

댓글