C# - ListView 컬럼 클릭 시 정렬하기


1) 헤더에는 다음을 사용하도록 선언한다.

private int RandomNumber(int min, int max)
using System.Collections;

 

2) 사용할 곳 네임스페이스 안에 다음과 같은 클래스를 만든다.

private int RandomNumber(int min, int max)
// 리스트뷰의 정렬을 위하여 사용함.
class ListViewItemComparer : IComparer
{
    private int col;
    public string sort = "asc";
    public ListViewItemComparer()
    {
        col = 0;
    }

    /// <summary>
    /// 컬럼과 정렬 기준(asc, desc)을 사용하여 정렬 함.
    /// </summary>
    /// <param name="column">몇 번째 컬럼인지를 나타냄.</param>
    /// <param name="sort">정렬 방법을 나타냄. Ex) asc, desc</param>
    public ListViewItemComparer(int column, string sort)
    {
        col = column;
        this.sort = sort;
    }

    public int Compare(object x, object y)
    {
        if (sort == "asc")
            return String.Compare(((ListViewItem)x).SubItems[col].Text, ((ListViewItem)y).SubItems[col].Text);
        else
            return String.Compare(((ListViewItem)y).SubItems[col].Text, ((ListViewItem)x).SubItems[col].Text);
    }


    // 숫자의 정확한 sort를 하기 위해서는 
    // http://www.codeproject.com/KB/recipes/csnsort.aspx 사용하자.
    // using ns; 선언 필요
    /*
    public int Compare(object x, object y)
    {
        if (sort == "asc")
            return StringLogicalComparer.Compare(((ListViewItem)x).SubItems[col].Text, ((ListViewItem)y).SubItems[col].Text);
        else
            return StringLogicalComparer.Compare(((ListViewItem)y).SubItems[col].Text, ((ListViewItem)x).SubItems[col].Text);
    }
    */
}

 

3) 사용할 이벤트가 있는 곳에 다음과 같이 처리한다.

private int RandomNumber(int min, int max)
private void listViewMyCom_ColumnClick(object sender, ColumnClickEventArgs e)
{
    // 방향 초기화
    for(int i=0; i<lstEvent.Columns.Count; i++)
    {
        listview.Columns[i].Text = listview.Columns[i].Text.Replace(" △", "");
        listview.Columns[i].Text = listview.Columns[i].Text.Replace(" ▽", "");
    }

    // DESC
    if (this.listview.Sorting == SortOrder.Ascending || listview.Sorting == SortOrder.None)
    {
        this.listview.ListViewItemSorter = new ListViewItemComparer(e.Column, "desc");
        listview.Sorting = SortOrder.Descending;
        listview.Columns[e.Column].Text = listview.Columns[e.Column].Text + " ▽";
    }
    // ASC
    else
    {
        this.listview.ListViewItemSorter = new ListViewItemComparer(e.Column, "asc");
        listview.Sorting = SortOrder.Ascending;
        listview.Columns[e.Column].Text = listview.Columns[e.Column].Text + " △";
    }
    listview.Sort();

    // 컬럼 갯수가 변경되는 구조라면 sorter를 null 처리하여야 함
    lstStat.ListViewItemSorter = null;
}

 

광고

댓글 남기기