[WinForm] 리스트뷰(ListView) 사용하기

[WinForm] 리스트뷰(ListView) 사용하기

이전 글에서 리스트 박스에 대해 알아보았습니다. 이번 글에서는 리스트뷰에 대해 알아보겠습니다.
리스트 박스와 사용법은 대부분 비슷합니다. 리스트뷰는 단순 목록부터 복잡한 세부 정보 보기까지 다양한 레이아웃을 지원하며, 다중 열 구조와 아이콘 표시 기능을 제공합니다.
이 글에서는 세부 정보 보기(Detail)로 구현해보겠습니다.


자주 사용하는 속성 및 이벤트

리스트뷰에서 자주 사용하는 속성과 이벤트는 아래와 같습니다. 맨 위 View와 GridLines, Columns 속성을 제외하면 리스트 박스와 유사한 것을 볼 수 있습니다.

속성설명
ViewLargeIcon: 큰 아이콘과 텍스트 표시
SmallIcon: 작은 아이콘과 텍스트 표시
List: 텍스트만 세로로 나열
Details: 여러 열로 구성된 표 형식
Tile: 타일 형식으로 아이콘과 텍스트를 표시
GridLines그리드 라인 그리기
Columns열(Column) 컬렉션을 제공
Items항목(Item) 컬렉션을 제공
SelectedItems현재 선택된 항목들의 컬렉션 제공
Scrollable스크롤 사용
Sorting정렬
MultiSelect여러 항목 선택
FullRowSelectDetails로 표시할 때 선택 시 전체 행을 선택
SelectedIndexChanged항목 선택이 변경될 때 발생.
DoubleClick항목을 더블 클릭했을 때 발생.

칼럼 및 아이템 추가

칼럼은 아래와 같이 Columns와 Add 함수를 통해 추가할 수 있습니다.

listView.Columns.Add("칼럼1", 100);
listView.Columns.Add("칼럼2", 100);
listView.Columns.Add("칼럼3", 100);

아이템 추가는 ListViewItem을 사용해보겠습니다. 아래와 같이 ListViewItem 생성자에서 문자열을 집어 넣거나, TextSubItems를 사용하여 추가 가능합니다.

ListViewItem listViewItem = new ListViewItem(new[] { $"{i}행, 1번째", $"{i}행, 2번째", $"{i}행, 3번째" });
//또는
ListViewItem listViewItem = new ListViewItem();
listViewItem.Text = $"{i}행 1번째";
listViewItem.SubItems.Add($"{i}행 2번째");
listViewItem.SubItems.Add($"{i}행 3번째");

listView.Items.Add(listViewItem);

위 글의 내용과 코드들을 기반으로 샘플 프로그램을 만들어보겠습니다.

디자인

아래와 같이 디자인을 해줍니다. 각 컨트롤의 속성은 적당히 맞춰주시면 되는데 TextBox 속성 중에 Multiline 속성만 True로 해주시면 됩니다.

코드

그 다음 폼 Load 이벤트 함수에 아래와 같이 코딩합니다.

private void Form1_Load(object sender, EventArgs e)
{
    // 콤보 박스 설정
    cbViewMode.Items.AddRange(new string[] {
        "View.LargeIcon",
        "View.Details",
        "View.SmallIcon",
        "View.List",
        "View.Tile" });
    cbViewMode.SelectedIndex = 1; // 콤보 박스 Details 선택하게

    // 리스트뷰
    //listView.View = View.LargeIcon; // 큰 아이콘 형태
    listView.View = View.Details; // 세부사항(기본값)
    //listView.View = View.SmallIcon; // 작은 아이콘 형태
    //listView.View = View.List; // 간단한 하나의 행
    //listView.View = View.Tile; // 타일형태
    listView.Scrollable = true; // 스크롤 표시
    listView.MultiSelect = true; // 멀티 선택
    listView.FullRowSelect = true; // 한줄 전체 선택
    listView.GridLines = true; // 라인 표시

    // 리스트뷰 칼럼
    listView.Columns.Add("칼럼1", 100); // 칼럼 추가, 너비 100
    listView.Columns.Add("칼럼2", 100); // 칼럼 추가, 너비 100
    listView.Columns.Add("칼럼3", 100); // 칼럼 추가, 너비 100
}

추가 버튼 클릭 이벤트 함수에 아래와 같이 정의합니다. 아이템을 3천 개 추가하는 함수입니다. BeginUpdateEndUpdate 해주는 것도 잊지 않습니다.

private void btnAdd_Click(object sender, EventArgs e)
{
    listView.BeginUpdate();
    for (int i = 0; i < 3000; i++)
    {
        ListViewItem listViewItem = new ListViewItem(new[] { $"{i}행, 1번째", $"{i}행, 2번째", $"{i}행, 3번째" });

        //또는
        //ListViewItem listViewItem = new ListViewItem();
        //listViewItem.Text = $"{i}행 1번째";
        //listViewItem.SubItems.Add($"{i}행 2번째");
        //listViewItem.SubItems.Add($"{i}행 3번째");

        listView.Items.Add(listViewItem);
    }
    listView.EndUpdate();
}

그 다음 콤보 박스가 선택이 변경 되었을 때 사용하는 SelectedIndexChanged 함수를 추가 후 아래와 같이 정의해줍니다.

private void cbViewMode_SelectedIndexChanged(object sender, EventArgs e)
{
    View iStyle = View.Details;
    switch (cbViewMode.Text)
    {
        case "View.LargeIcon":
            iStyle = View.LargeIcon;
            break;
        case "View.Details":
            iStyle = View.Details;
            break;
        case "View.SmallIcon":
            iStyle = View.SmallIcon;
            break;
        case "View.List":
            iStyle = View.List;
            break;
        case "View.Tile":
            iStyle = View.Tile;
            break;
    }

    listView.View = iStyle; // View 스타일 설정
}

그 다음 마지막으로 리스트 뷰 아이템을 선택 했을 때 텍스트 박스에 표시하는 예제입니다. 리스트 뷰 SelectedIndexChanged 함수를 추가해줍니다.

private void listView_SelectedIndexChanged(object sender, EventArgs e)
{
    if (listView.SelectedItems.Count <= 0) // 선택한거 없으면 그냥 함수 종료
        return;

    StringBuilder stringBuilder = new StringBuilder();
    foreach (ListViewItem item in listView.SelectedItems)
    {
        stringBuilder.AppendLine("=== " + item.Text + " ===");
        foreach (ListViewItem.ListViewSubItem subitem in item.SubItems)
        {
            stringBuilder.AppendLine(subitem.Text);
        }
        stringBuilder.AppendLine();
    }

    tbSelectInfo.Text = stringBuilder.ToString(); // 텍스트 박스에 표시
}

결과

실행 시켜 확인해 봅니다. 추가 버튼을 누르면 아이템이 추가되고, 콤보 박스 변경 시 보기 모드가 변경됩니다. 그리고 아이템 단일/다중 선택 시 우측에 잘 표시되는 것을 볼 수 있습니다.


github : https://github.com/3001ssw/c_sharp/tree/main/WinForm/List