在 msdn 示例上改的,可以对数字排序:
using System.Collections;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
ListView listview = new ListView();
public Form1()
{
InitializeComponent();
this.Size = new System.Drawing.Size(400, 300);
listview.Dock = DockStyle.Fill;
listview.Parent = this;
//详细视图
listview.View = View.Details;
//选择总行
listview.FullRowSelect = true;
//设置 listview 的排序方法,在列标头事件中可以取出用来判断
listview.Sorting = SortOrder.Ascending;
//设置按第1列排序
listview.ListViewItemSorter = new ListViewItemComparer(listview.Sorting, 1);
listview.Columns.Add("名称", 80, HorizontalAlignment.Left);
listview.Columns.Add("排名", 50, HorizontalAlignment.Center);
listview.Columns.Add("描述", 200, HorizontalAlignment.Left);
//添加测试数据
ListViewItem lvi = new ListViewItem("AAA");
lvi.SubItems.Add("1");
lvi.SubItems.Add("哎,我是AAA");
listview.Items.Add(lvi);
lvi = new ListViewItem("BBB");
lvi.SubItems.Add("2");
lvi.SubItems.Add("啊,我是BBB");
listview.Items.Add(lvi);
lvi = new ListViewItem("CCC");
lvi.SubItems.Add("3");
lvi.SubItems.Add("这是CCC");
listview.Items.Add(lvi);
//添加列标题单击事件方法
listview.ColumnClick += Listview_ColumnClick;
}
// listview 列标头单击事件方法。
private void Listview_ColumnClick(object sender, ColumnClickEventArgs e)
{
if (listview.Sorting == SortOrder.Ascending)
{
listview.ListViewItemSorter = new ListViewItemComparer(SortOrder.Descending, e.Column);
listview.Sorting = SortOrder.Descending;
}
else
{
listview.ListViewItemSorter = new ListViewItemComparer(SortOrder.Ascending, e.Column);
listview.Sorting = SortOrder.Ascending;
}
}
}
//定义一个类,这个类实现 IComparer 接口
class ListViewItemComparer : IComparer
{
private int col;
private SortOrder sort = SortOrder.None;
public ListViewItemComparer(SortOrder sortOrder)
{
col = 0;
}
public ListViewItemComparer(SortOrder sortOrder, int column)
{
sort = sortOrder;
col = column;
}
//实现接口的 Compare 方法,x、y 为要比较的两个对象
public int Compare(object x, object y)
{
//默认升序。判断传入的排序枚举,如果为降序就对换要比较的对象
if (sort == SortOrder.Descending)
{
object temp = x;
x = y;
y = temp;
}
string xx = ((ListViewItem)x).SubItems[col].Text;
string yy = ((ListViewItem)y).SubItems[col].Text;
int xxx = 0;
int yyy = 0;
//判断是否可以转换为数字,如果可以就按数字比较
if (int.TryParse(xx.ToString(), out xxx) && int.TryParse(yy.ToString(), out yyy))
return xxx.CompareTo(yyy);//按数字比较
return string.Compare(xx, yy);//按字符比较
}
}
}