티스토리 뷰

C#

C#: ListView Colum 정렬 DLL

개태형님 2016. 10. 6. 16:28

ListView Colum 클릭시 정렬 자체는 간단하지만 기본적으로 문자로 인식하고 정렬하기 때문에 의도치 않는 결과를 얻을 수 있다.

ex) 1, 2, 3, 10, 100 -> 1, 10, 100, 2, 3

 

매번 필요할때마다 찾고 코드를 추가하기 귀찮아서 dll파일로 만들어서 github에 올려둠.

Github : github.com/vip00112/ListViewColumSortDLL

 

[전체 코드]

    public class ItemSort
    {
        /// <summary>
        /// ListView ColumnClick 함수 내에서 클릭
        /// 최초 클릭시 오름차순(ASC) 정렬 됨
        /// </summary>
        /// <param name="listView">정렬할 ListView 객체</param>
        /// <param name="e">ColumnClick Event의 이벤트 객체</param>
        /// <param name="isNumber">숫자형 정렬 여부</param>
        public static void Sort(ListView listView, ColumnClickEventArgs e, bool isNumber)
        {
            var sorter = listView.ListViewItemSorter as ItemComparer;
            if (sorter == null)
            {
                sorter = new ItemComparer(e.Column);
                sorter.Order = SortOrder.Ascending;
                listView.ListViewItemSorter = sorter;
            }

            sorter.IsNumber = isNumber;
            if (e.Column == sorter.Column)
            {
                if (sorter.Order == SortOrder.Ascending)
                {
                    sorter.Order = SortOrder.Descending;
                }
                else
                {
                    sorter.Order = SortOrder.Ascending;
                }
            }
            else
            {
                sorter.Column = e.Column;
                sorter.Order = SortOrder.Ascending;
            }
            listView.Sort();
        }
    }

    public class ItemComparer : System.Collections.IComparer
    {
        /// <summary>
        /// 정렬할 컬럼의 index
        /// </summary>
        public int Column { get; set; }

        /// <summary>
        /// 정렬 방식
        /// ASC, DESC
        /// </summary>
        public SortOrder Order { get; set; }

        /// <summary>
        /// 숫자형 정렬 여부
        /// </summary>
        public bool IsNumber { get; set; }

        public ItemComparer(int colIndex)
        {
            Column = colIndex;
            Order = SortOrder.None;
            IsNumber = false;
        }

        public int Compare(object a, object b)
        {
            int result;

            var itemA = a as ListViewItem;
            var itemB = b as ListViewItem;

            if (IsNumber)
            {
                result = int.Parse(itemA.SubItems[Column].Text) - int.Parse(itemB.SubItems[Column].Text);
            }
            else
            {
                result = string.Compare(itemA.SubItems[Column].Text, itemB.SubItems[Column].Text);
            }

            if (Order == SortOrder.Descending)
            {
                result *= -1;
            }
            return result;
        }
    }

 

[사용 방법]

1. 정렬을 사용할 ListView객체에 ColumClick 이벤트 등록

2. ColumClick 이벤트 안에서 함수 호출

        private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
        {
            // 0번 컬럼: 숫자 정렬
            if (e.Column == 0)
            {
                ItemSort.Sort(listView1, e, true);
            }

            // 1번 컬럼: 문자 정렬
            else if (e.Column == 1)
            {
                ItemSort.Sort(listView1, e, false);
            }

            // 그 외 컬럼: 문자 정렬
            else
            {
                ItemSort.Sort(listView1, e, false);
            }
        }
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday