关于在ListView的标题上添加排序的问题。
看了好多描述在ListView标题上添加点击排序的文章,也试了好多的方法,有方便的也有麻烦的,有些需要重建整个ListView,有些只需要实现排序的接口。
作为一个懒人,肯定是要找一个又方便又容易看懂的啦,接下来的这个方法我感觉很不错。
PS:实际尝试过程中发现网上的一些方法有一个误区,错误的将int型的值同string型的值一样排序可能会导致排序的错乱,比如初始的文件时8,2,5,1,7 排序以后可能是1,8,2,5,7.
首先创建一个listview,然后将其中的属性——>fullrowselect改为true,MultiSelect改为False,View改为Details,十万分注意的是,此处务必将HeaderStyle改为Clickable,否则标题无法点击。
然后添加listViewProcess_ColumnClick事件。
事件代码如下:
private int sortColumn = -1;//标识是否已经排序过 private void listViewProcess_ColumnClick(object sender, ColumnClickEventArgs e) { //初始化时默认按照升序进行一次排序 if (e.Column != sortColumn) { // 如果没有进行排序的话将排序标识改为e.Column sortColumn = e.Column; // 默认升序. listViewProcess.Sorting = SortOrder.Ascending; } else { // 判断上一次的排序,再次点击后排序与此相反. if (listViewProcess.Sorting == SortOrder.Ascending) listViewProcess.Sorting = SortOrder.Descending; else listViewProcess.Sorting = SortOrder.Ascending; } //进行排序. listViewProcess.Sort(); //将比较器更新到重写的类中进行排序 this.listViewProcess.ListViewItemSorter = new ListViewItemComparer(e.Column, listViewProcess.Sorting); }
重写的类中的代码处理如下:
public class ListViewItemComparer : IComparer { private int col; private SortOrder order; public ListViewItemComparer() { col = 0; order = SortOrder.Ascending; } public ListViewItemComparer(int column, SortOrder order) { col = column; this.order = order; } public int Compare(object x, object y) { int returnVal = -1; int a = 0, b = 0; if (int.TryParse(((ListViewItem)x).SubItems[col].Text, out a) && int.TryParse(((ListViewItem)y).SubItems[col].Text, out b)) { returnVal = a >= b ? (a == b ? 0 : 1) : -1; if (order == SortOrder.Descending) returnVal *= -1; } else { returnVal = String.Compare(((ListViewItem)x).SubItems[col].Text, ((ListViewItem)y).SubItems[col].Text); if (order == SortOrder.Descending) returnVal *= -1; } return returnVal; } }
此处注意如果是整型则先进行Convert以后再排序不会出现排序乱的问题。
浙公网安备 33010602011771号