본문 바로가기
Programming/c# 스터디

[c#] 리스트뷰(Listview)에서 컬럼을 클릭하면 내림차순 / 오름차순 (랭킹) 으로 행을 정렬하는 코드

by 아뾰오옹 2023. 4. 25.
반응형

c# 리스트뷰에서 컬럼을 클링했을 때, 출력된 아이템을 행으로 정렬하는 코드입니다. 

사실 코드는 인터넷 여행을 하다가 찾은거고, 셀프 스터디를 하는 목적으로 글을 남깁니다. 

 

혹시 수정이나 보충하고 싶은 부분이 있으면 댓글로 달아주시면 감사하겠습니다. 

 

1. 리스트뷰 이벤트 생성

리스트뷰 이벤트에서 ColumnClick 칸을 더블클릭해서 자동으로 이벤트를 만들어 줍니다. 

2. 리스트뷰 컬럼클릭이벤트 코드 생성 

//정렬
            if (listView_calData.Sorting == SortOrder.Ascending)
            {
                listView_calData.Sorting = SortOrder.Descending;
            }
            else
            {
                listView_calData.Sorting = SortOrder.Ascending;
            }

            listView_calData.ListViewItemSorter = new Sorter();      // * 1
            Sorter s = (Sorter)listView_calData.ListViewItemSorter;
            s.Order = listView_calData.Sorting;
            s.Column = e.Column;
            listView_calData.Sort();

컬럼을 클릭할 때마다 토글형태로 Ascending 과 Descending 이 바뀌도록 합니다. 

ListViewItemSorter 클래스를 생성합니다. 

 

3. ListViewItemSorter 코드

class Sorter : System.Collections.IComparer
    {
        public int Column = 0;
        public System.Windows.Forms.SortOrder Order = SortOrder.Ascending;
        public int Compare(object x, object y) // IComparer Member
        {
            if (!(x is ListViewItem))
                return (0);
            if (!(y is ListViewItem))
                return (0);

            ListViewItem l1 = (ListViewItem)x;
            ListViewItem l2 = (ListViewItem)y;

            if (l1.ListView.Columns[Column].Tag == null) 
            {
                l1.ListView.Columns[Column].Tag = "Text";
            }

            if (l1.ListView.Columns[Column].Tag.ToString() == "Numeric") 
            {

                string str1 = l1.SubItems[Column].Text;
                string str2 = l2.SubItems[Column].Text;

                if (str1 == "")
                {
                    str1 = "99999";
                }
                if (str2 == "")
                {
                    str2 = "99999";
                }

                float fl1 = float.Parse(str1);   
                float fl2 = float.Parse(str2);    

                if (Order == SortOrder.Ascending)
                {
                    return fl1.CompareTo(fl2);
                }
                else
                {
                    return fl2.CompareTo(fl1);
                }
            }
            else
            {
                string str1 = l1.SubItems[Column].Text;
                string str2 = l2.SubItems[Column].Text;

                if (str1 == "")
                {
                    str1 = "99999";
                }
                if (str2 == "")
                {
                    str2 = "99999";
                }

                float fl1 = float.Parse(str1);    
                float fl2 = float.Parse(str2);    

                if (Order == SortOrder.Ascending)
                {
                    return fl1.CompareTo(fl2);
                }
                else
                {
                    return fl2.CompareTo(fl1);
                }
            }
        }
    }

 

숫자든 문자열이든 구분하여 리스트뷰를 정렬합니다. 

 

반응형

댓글