您的当前位置:首页listview按列自动排序的一点补充

listview按列自动排序的一点补充

2023-03-08 来源:爱问旅游网
listview按列⾃动排序的⼀点补充

摘要: 使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(\"\"); } }

现在我们就可以进⾏⽐较⽽不会出现刚才那个错误了.

⼩结:不知道⼤家看懂了不,多提点意见了,个⼈觉得这个还是有点实⽤的,欢迎指点.

因篇幅问题不能全部显示,请点此查看更多更全内容