摘要: 使listview按列⾃动排序的例⼦⽹上有很多,MSDN上⾯也有,但是似乎都没指出这样⼀种情况:当我们点击列头进⾏排序时,如果⾥⾯有⼀⼦项不存在或者多项不存在,该怎么⽐较?前两天我就碰到了这样的情况,现在,我把⾃⼰的⼀些⼼得拿出来和⼤家分享.
⼤的就不⽤说了,我们都知道要实现listview的⾃定义排序,必须编写⼀个实现 IComparer 接⼝的类,并将 属性设置为该类的⼀个对象.起初,我按照⽰例编写了⼀个⾃定义排序的类,并在listview的ColumnClick 事件下添加了相应代码.代码如下: 1.实现排序的类:
public class ColumnSort:IComparer {
private int colNum;
private bool bAscend = true;
public bool Ascend {
get {
return bAscend; } set {
bAscend = value; } }
public ColumnSort(int sortColun) {
this.colNum = sortColun; }
public int Compare(object A, object B) {
System.Windows.Forms.ListViewItem listItemA = (System.Windows.Forms.ListViewItem)A; System.Windows.Forms.ListViewItem listItemB = (System.Windows.Forms.ListViewItem)B; int result;
//对相邻的两项进⾏⽐较
result = String.Compare(listItemA.SubItems[colNum].ToString(), listItemB.SubItems[colNum].ToString()); if (bAscend == true) return result; else
return (-1) * result; } }
2.主窗体
public partial class Form1 : Form {
public Form1() {
InitializeComponent(); }
private void Form1_Load(object sender, EventArgs e) {
this.listView1.Items.Add(\"kandy\");
this.listView1.Items[0].SubItems.Add(\"0\"); this.listView1.Items[0].SubItems.Add(\"11\"); this.listView1.Items[0].SubItems.Add(\"10\"); this.listView1.Items.Add(\"list\");
this.listView1.Items[1].SubItems.Add(\"1\"); this.listView1.Items[1].SubItems.Add(\"22\"); this.listView1.Items[1].SubItems.Add(\"44\"); this.listView1.Items.Add(\"jsjlili\");
this.listView1.Items[2].SubItems.Add(\"1\"); this.listView1.Items[2].SubItems.Add(\"33\"); this.listView1.Items.Add(\"ff\");
this.listView1.Items[3].SubItems.Add(\"99\");
//this.listView1.Items[4].SubItems.Add(\"0\"); //this.listView1.Items
//this.listView1.Items[4].SubItems.Add(\"77\"); }
private void listView1_ColumnClick(object sender, ColumnClickEventArgs e) {
ColumnSort colSort = new ColumnSort(e.Column); int iRow = this.listView1.Columns.Count; int iCol = this.listView1.Items.Count;
colSort.Ascend = (this.listView1.Sorting == SortOrder.Ascending); if (colSort.Ascend == true) {
this.listView1.Sorting = SortOrder.Descending; } else {
this.listView1.Sorting = SortOrder.Ascending; }
//this.listView1.Sort();
this.listView1.ListViewItemSorter = colSort; } }
⼤家仔细看这个Form1类,会发现listview1第四⾏只有两项,运⾏程序时当我们点击第⼀列,第⼆列进⾏排序是不会出问题,但是如果我们点击了第三列或者第四列的时候就会抛出ArgumentOutOfRangeException异常,仔细⼀看我们就明⽩了,原来第四项根本就只有2个⼦项,点击第三列或者第四列的时候,listItemA.SubItems[colNum]是根本不存在的,所以程序报错了.经过考虑,我的做法如下,⾸先判断listviewitem中是否有空项(即不存在的项),如果有则增加⼀项并将内容初始化为空,然后再进⾏⽐较. 在ColumnSort类中的Compare函数中插⼊如下代码:
int iColA = listItemA.SubItems.Count;
int iColB= listItemB.SubItems.Count;
//判断listviewitem中是否有空项,如果有空项则将其置为空,然后再进⾏⽐较 if (iColA.CompareTo(iColB) > 0) {
for (int i = 1; i <= iColA - iColB; i++) {
listItemB.SubItems.Add(\"\"); } } else {
for (int j = 1; j <= iColB - iColA; j++) {
listItemA.SubItems.Add(\"\"); } }
现在我们就可以进⾏⽐较⽽不会出现刚才那个错误了.
⼩结:不知道⼤家看懂了不,多提点意见了,个⼈觉得这个还是有点实⽤的,欢迎指点.
因篇幅问题不能全部显示,请点此查看更多更全内容