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.
如果您开始使用ListView,那么如果您使用ObjectListView,您的生活将会轻松得多.ObjectListView是一个围绕.NET WinForms ListView的开源包装器,它解决了所有这些烦人的小问题,这些问题通常使得使用ListView非常令人沮丧.例如,它会自动对int进行排序,以便在'3'之后出现'100'(DateTimes,bools,以及其他所有内容也正确排序).
说真的,在使用ObjectListView之后,你永远不会想要回到普通的ListView.
是的,我是作者 - 但这并不意味着我有偏见......好吧,也许它确实:)看看这里有其他人的意见.