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

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

c#,。net 2.0,Winform

System.Windows.Forms.ListView

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

首先使用这个类:

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); } } } } 

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

 lvSeries.ListViewItemSorter = new Sorter(); 

然后处理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(); } 

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

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

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

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

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

您将需要创建一个实现IComparer接口的类(非generics接口)。 在该类中,您从正确的子项中读取Text属性,将其转换为int,并进行比较:

 public class IntegerComparer : IComparer { private int _colIndex; public IntegerComparer(int colIndex) { _colIndex = colIndex; } public int Compare(object x, object y) { int nx = int.Parse((x as ListViewItem).SubItems[_colIndex].Text); int ny = int.Parse((y as ListViewItem).SubItems[_colIndex].Text); return nx.CompareTo(ny); } } 

然后将这样的比较器分配给ListViewItemSorter属性并调用ListView控件的sort方法:

 // create a comparer for column index 1 and assign it to the control, and sort myListView.ListViewItemSorter = new IntegerComparer(1); myListView.Sort(); 

我会在数据源(模型)而不是视图中执行此操作。 在那里排序它应该通过数据绑定在视图中更新它。

我使用了Neil-N的类,但更改了if语句以测试Type属性而不是Tag属性。 我将每列设置为Type Number(而不是Text),其中包含整数值。 排序很棒。

 if (l1.ListView.Columns[Column].Type.ToString() == "Number") 
 class ListViewAutoSorter : System.Collections.IComparer { private int Column = 0; private System.Windows.Forms.SortOrder Order = SortOrder.Ascending; public ListViewAutoSorter(int Column, SortOrder Order) { this.Column = Column; this.Order = Order; } public int Compare(object x, object y) // IComparer Member { if (!(x is ListViewItem)) return (0); if (!(y is ListViewItem)) return (0); var l1 = (ListViewItem)x; var l2 = (ListViewItem)y; var value1 = 0.0; var value2 = 0.0; if (Double.TryParse(l1.SubItems[Column].Text, out value1) && Double.TryParse(l2.SubItems[Column].Text, out value2)) { if (Order == SortOrder.Ascending) { return value1.CompareTo(value2); } else { return value2.CompareTo(value1); } } else { var str1 = l1.SubItems[Column].Text; var str2 = l2.SubItems[Column].Text; if (Order == SortOrder.Ascending) { return str1.CompareTo(str2); } else { return str2.CompareTo(str1); } } } }