how do I sort Integers in a listview

前端 未结 7 1689
天命终不由人
天命终不由人 2020-12-16 06:04

How do I sort columns of integers in a ListView

c#, .net 2.0, Winform

System.Windows.Forms.ListView

7条回答
  •  北海茫月
    2020-12-16 06:15

    This is how I accomplished being able to sort on multiple columns, and being able to sort each column as a number, or as text.

    First use this class:

    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")
            {
                float fl1 = float.Parse(l1.SubItems[Column].Text);
                float fl2 = float.Parse(l2.SubItems[Column].Text);
    
                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 (Order == SortOrder.Ascending)
                {
                    return str1.CompareTo(str2);
                }
                else
                {
                    return str2.CompareTo(str1);
                }
            }
        }
    }
    

    In your form's constructor, set the sorter like this:

    lvSeries.ListViewItemSorter = new Sorter();
    

    Then handle the ColumnClick even of your listview control like this:

    private void lvSeries_ColumnClick(object sender, ColumnClickEventArgs e)
        {
            Sorter s = (Sorter)lvSeries.ListViewItemSorter;
            s.Column = e.Column;
    
            if (s.Order == System.Windows.Forms.SortOrder.Ascending)
            {
                s.Order = System.Windows.Forms.SortOrder.Descending;
            }
            else
            {
                s.Order = System.Windows.Forms.SortOrder.Ascending;
            }
            lvSeries.Sort();
        }
    

    This is all dependent on the Tag property of each column either being set to "Numeric" or not, so the sorter knows how to sort.

    In the above example I cast the values as floats when numeric, you may want to change that to int.

提交回复
热议问题