我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。
这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。
源码指引:github源码指引_初级代码游戏的博客-CSDN博客
ListView是可以默认排序的,但排序规则只能是字符串。但我们一般标准的排序行为是单击列头排序、区分字符串和数字、连续单击列头改变排序顺序,而且最好是稳定排序(改变排序的列原顺序尽量不变)。
下面是一个排序实现的套路,排序类无需修改即可用于多个ListView。
目录
一、ListView的排序接口
ListView支持改变排序行为,通过设置排序属性ListViewItemSorter来实现。
sorter = new mySorter();
//为ListViewItemSorter指定排序类
listView_picture.ListViewItemSorter = sorter;
sorter.SortOrder = SortOrder.Ascending;
sorter.SortColumn = 0;
sorter.SortAsNumber = true;
以上代码中mySorter是我们自己定义的排序对象,带有三个属性,分别控制排序顺序、排序列和是否是数字规则。
如果ListView设置为自动排序的,则上述代码已经可以实现排序。如果不是自动排序,则需要调用Sort方法来排序,在调用之前可以改变排序规则。
二、排序类
public class mySorter : System.Collections.IComparer
{
public mySorter()
{
SortColumn = 0;
SortOrder = SortOrder.None;
SortAsNumber = false;
}
//指定进行排序的列
public int SortColumn { get; set; }
//指定按升序或降序进行排序
public SortOrder SortOrder { get; set; }
//指定按照数字规则排序
public bool SortAsNumber { get; set; }
public int Compare(object x, object y)
{
int CompareResult;
ListViewItem itemX = (ListViewItem)x;
ListViewItem itemY = (ListViewItem)y;
if (SortAsNumber)
{
double result = Convert.ToDouble(itemX.SubItems[SortColumn].Text) - Convert.ToDouble(itemY.SubItems[SortColumn].Text);
CompareResult = result < 0 ? -1 : (result > 0 ? 1 : 0);
}
else
{
CompareResult = itemX.SubItems[SortColumn].Text.CompareTo(itemY.SubItems[SortColumn].Text);
}
return SortOrder == SortOrder.Ascending ? CompareResult : SortOrder == SortOrder.Descending ? -CompareResult : 0;
}
}
排序类是IComparer的实现,重点是Compare方法。
这个类还有一点简单,不能支持多列排序。
多列排序需要记住之前排序的列,然后逐个比较,代码会有一点复杂。
三、处理列头单击事件
前面的代码已经可以排序,如果要根据用户操作来排序,则需要处理列头单击事件。
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
if (e.Column == this.sorter.SortColumn)
{
if (this.sorter.SortOrder == SortOrder.Ascending)
this.sorter.SortOrder = SortOrder.Descending;
else
if (this.sorter.SortOrder == SortOrder.Descending)
this.sorter.SortOrder = SortOrder.Ascending;
else
return;
}
else
{
this.sorter.SortColumn = e.Column;
}
this.listView1.Sort();
}
这个代码判断被单击的列和上次的是否相同,相同则改变排序顺序。
(这里是文档结束)