如何在列表视图中对整数进行排序

Bra*_*rad 6 c# listview winforms

如何在ListView中对整数列进行排序

c#,.net 2.0,Winform

System.Windows.Forms.ListView

Nei*_*l N 19

这就是我完成对多列进行排序,并能够将每列作为数字或文本进行排序的方法.

首先使用这个类:

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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在表单的构造函数中,将分类器设置为:

lvSeries.ListViewItemSorter = new Sorter();
Run Code Online (Sandbox Code Playgroud)

然后处理ColumnClick甚至是listview控件,如下所示:

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();
    }
Run Code Online (Sandbox Code Playgroud)

这完全取决于每列的Tag属性是否设置为"Numeric",因此分拣机知道如何排序.

在上面的例子中,我在数值时将值转换为浮点数,您可能希望将其更改为int.


Gra*_*ian 5

如果您开始使用ListView,那么如果您使用ObjectListView,您的生活将会轻松得多.ObjectListView是一个围绕.NET WinForms ListView的开源包装器,它解决了所有这些烦人的小问题,这些问题通常使得使用ListView非常令人沮丧.例如,它会自动对int进行排序,以便在'3'之后出现'100'(DateTimes,bools,以及其他所有内容也正确排序).

说真的,在使用ObjectListView之后,你永远不会想要回到普通的ListView.

是的,我是作者 - 但这并不意味着我有偏见......好吧,也许它确实:)看看这里有其他人的意见.