listview按列自动排序的一点补充
摘要:   使listview按列自动排序的例子网上有很多,MSDN上面也有,但是似乎都没指出这样一种情况:当我们点击列头进行排序时,如果里面有一子项不存在或者多项不存在,该怎么比较?前两天我就碰到了这样的情况,现在,我把自己的一些心得拿出来和大家分享.
大的就不用说了,我们都知道要实现listview的自定义排序,必须编写一个实现IComparer  接口的类,并将 ListViewItemSorter 属性设置为该类的一个对象.起初,我按照示例编写了一个自定义排序的类,并在listview的ColumnClick 事件下添加了相应代码.代码如下:
1.实现排序的类: public class ColumnSort:IComparer
public class ColumnSort:IComparer
 {
    { 
 private int colNum;
        private int colNum;
 private bool bAscend = true;
        private bool bAscend = true;

 public bool Ascend
        public bool Ascend
 {
        {
 get
            get
 {
            {
 return bAscend;
                return bAscend;
 }
            }
 set
            set
 {
            {
 bAscend = value;
                bAscend = value;
 }
            }
 }
        }
 public ColumnSort(int sortColun)
        public ColumnSort(int sortColun)
 {
        {
 this.colNum = sortColun;
            this.colNum = sortColun;
 }
        }
 public int Compare(object A, object B)
        public int Compare(object A, object B)
 {
        {
 System.Windows.Forms.ListViewItem listItemA = (System.Windows.Forms.ListViewItem)A;
            System.Windows.Forms.ListViewItem listItemA = (System.Windows.Forms.ListViewItem)A;
 System.Windows.Forms.ListViewItem listItemB = (System.Windows.Forms.ListViewItem)B;
            System.Windows.Forms.ListViewItem listItemB = (System.Windows.Forms.ListViewItem)B;
 int result;
            int result;           
 //对相邻的两项进行比较
            //对相邻的两项进行比较
 result = String.Compare(listItemA.SubItems[colNum].ToString(), listItemB.SubItems[colNum].ToString());
            result = String.Compare(listItemA.SubItems[colNum].ToString(), listItemB.SubItems[colNum].ToString());
 if (bAscend == true)
            if (bAscend == true)
 return result;
                return result;
 else
            else
 return (-1) * result;
                return (-1) * result;
 }
        }
 
        
 }
    }
2.主窗体 public partial class Form1 : Form
public partial class Form1 : Form
 {
    {
 public Form1()
        public Form1()
 {
        {
 InitializeComponent();
            InitializeComponent();
 }
        }

 private void Form1_Load(object sender, EventArgs e)
        private void Form1_Load(object sender, EventArgs e)
 {
        {
 this.listView1.Items.Add("kandy");
            this.listView1.Items.Add("kandy");
 this.listView1.Items[0].SubItems.Add("0");
            this.listView1.Items[0].SubItems.Add("0");
 this.listView1.Items[0].SubItems.Add("11");
            this.listView1.Items[0].SubItems.Add("11");
 this.listView1.Items[0].SubItems.Add("10");
            this.listView1.Items[0].SubItems.Add("10");

 this.listView1.Items.Add("list");
            this.listView1.Items.Add("list");
 this.listView1.Items[1].SubItems.Add("1");
            this.listView1.Items[1].SubItems.Add("1");
 this.listView1.Items[1].SubItems.Add("22");
            this.listView1.Items[1].SubItems.Add("22");
 this.listView1.Items[1].SubItems.Add("44");
            this.listView1.Items[1].SubItems.Add("44");

 this.listView1.Items.Add("jsjlili");
            this.listView1.Items.Add("jsjlili");
 this.listView1.Items[2].SubItems.Add("1");
            this.listView1.Items[2].SubItems.Add("1");
 this.listView1.Items[2].SubItems.Add("33");
            this.listView1.Items[2].SubItems.Add("33");

 this.listView1.Items.Add("ff");
            this.listView1.Items.Add("ff");
 this.listView1.Items[3].SubItems.Add("99");
            this.listView1.Items[3].SubItems.Add("99");

 
            
 //this.listView1.Items[4].SubItems.Add("0");
            //this.listView1.Items[4].SubItems.Add("0");
 //this.listView1.Items
            //this.listView1.Items
 //this.listView1.Items[4].SubItems.Add("77");
            //this.listView1.Items[4].SubItems.Add("77");

 
           
 }
        }

 private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
        private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
 {
        {
 ColumnSort colSort = new ColumnSort(e.Column);
            ColumnSort colSort = new ColumnSort(e.Column);
 int iRow = this.listView1.Columns.Count;
            int iRow = this.listView1.Columns.Count;
 int iCol = this.listView1.Items.Count;
            int iCol = this.listView1.Items.Count;


 colSort.Ascend = (this.listView1.Sorting == SortOrder.Ascending);
            colSort.Ascend = (this.listView1.Sorting == SortOrder.Ascending);
 if (colSort.Ascend == true)
            if (colSort.Ascend == true)
 {
            {
 this.listView1.Sorting = SortOrder.Descending;
                this.listView1.Sorting = SortOrder.Descending;
 }
            }
 else
            else
 {
            {
 this.listView1.Sorting = SortOrder.Ascending;
                this.listView1.Sorting = SortOrder.Ascending;
 }
            }
 //this.listView1.Sort();
            //this.listView1.Sort();
 this.listView1.ListViewItemSorter = colSort;
            this.listView1.ListViewItemSorter = colSort;
 }
        }
 }
    }
 
     
大家仔细看这个Form1类,会发现listview1第四行只有两项,运行程序时当我们点击第一列,第二列进行排序是不会出问题,但是如果我们点击了第三列或者第四列的时候就会抛出ArgumentOutOfRangeException异常,仔细一看我们就明白了,原来第四项根本就只有2个子项,点击第三列或者第四列的时候,listItemA.SubItems[colNum]是根本不存在的,所以程序报错了.经过考虑,我的做法如下,首先判断listviewitem中是否有空项(即不存在的项),如果有则增加一项并将内容初始化为空,然后再进行比较.
在ColumnSort类中的Compare函数中插入如下代码:
 int iColA = listItemA.SubItems.Count;
int iColA = listItemA.SubItems.Count;
 int iColB= listItemB.SubItems.Count;
            int iColB= listItemB.SubItems.Count;
 //判断listviewitem中是否有空项,如果有空项则将其置为空,然后再进行比较
            //判断listviewitem中是否有空项,如果有空项则将其置为空,然后再进行比较
 if (iColA.CompareTo(iColB) > 0)
            if (iColA.CompareTo(iColB) > 0)
 {
            {
 for (int i = 1; i <= iColA - iColB; i++)
                for (int i = 1; i <= iColA - iColB; i++)
 {
                {
 listItemB.SubItems.Add("");
                    listItemB.SubItems.Add("");
 }
                }
 }
            }
 else
            else
 {
            {
 for (int j = 1; j <= iColB - iColA; j++)
                for (int j = 1; j <= iColB - iColA; j++)
 {
                {
 listItemA.SubItems.Add("");
                    listItemA.SubItems.Add("");
 }
                }
 }
            }
现在我们就可以进行比较而不会出现刚才那个错误了.
小结:不知道大家看懂了不,多提点意见了,个人觉得这个还是有点实用的,欢迎指点.
   
 
大的就不用说了,我们都知道要实现listview的自定义排序,必须编写一个实现
1.实现排序的类:
 public class ColumnSort:IComparer
public class ColumnSort:IComparer {
    {  private int colNum;
        private int colNum; private bool bAscend = true;
        private bool bAscend = true;
 public bool Ascend
        public bool Ascend {
        { get
            get {
            { return bAscend;
                return bAscend; }
            } set
            set {
            { bAscend = value;
                bAscend = value; }
            } }
        } public ColumnSort(int sortColun)
        public ColumnSort(int sortColun) {
        { this.colNum = sortColun;
            this.colNum = sortColun; }
        } public int Compare(object A, object B)
        public int Compare(object A, object B) {
        { System.Windows.Forms.ListViewItem listItemA = (System.Windows.Forms.ListViewItem)A;
            System.Windows.Forms.ListViewItem listItemA = (System.Windows.Forms.ListViewItem)A; System.Windows.Forms.ListViewItem listItemB = (System.Windows.Forms.ListViewItem)B;
            System.Windows.Forms.ListViewItem listItemB = (System.Windows.Forms.ListViewItem)B; int result;
            int result;            //对相邻的两项进行比较
            //对相邻的两项进行比较 result = String.Compare(listItemA.SubItems[colNum].ToString(), listItemB.SubItems[colNum].ToString());
            result = String.Compare(listItemA.SubItems[colNum].ToString(), listItemB.SubItems[colNum].ToString()); if (bAscend == true)
            if (bAscend == true) return result;
                return result; else
            else return (-1) * result;
                return (-1) * result; }
        } 
         }
    }2.主窗体
 public partial class Form1 : Form
public partial class Form1 : Form {
    { public Form1()
        public Form1() {
        { InitializeComponent();
            InitializeComponent(); }
        }
 private void Form1_Load(object sender, EventArgs e)
        private void Form1_Load(object sender, EventArgs e) {
        { this.listView1.Items.Add("kandy");
            this.listView1.Items.Add("kandy"); this.listView1.Items[0].SubItems.Add("0");
            this.listView1.Items[0].SubItems.Add("0"); this.listView1.Items[0].SubItems.Add("11");
            this.listView1.Items[0].SubItems.Add("11"); this.listView1.Items[0].SubItems.Add("10");
            this.listView1.Items[0].SubItems.Add("10");
 this.listView1.Items.Add("list");
            this.listView1.Items.Add("list"); this.listView1.Items[1].SubItems.Add("1");
            this.listView1.Items[1].SubItems.Add("1"); this.listView1.Items[1].SubItems.Add("22");
            this.listView1.Items[1].SubItems.Add("22"); this.listView1.Items[1].SubItems.Add("44");
            this.listView1.Items[1].SubItems.Add("44");
 this.listView1.Items.Add("jsjlili");
            this.listView1.Items.Add("jsjlili"); this.listView1.Items[2].SubItems.Add("1");
            this.listView1.Items[2].SubItems.Add("1"); this.listView1.Items[2].SubItems.Add("33");
            this.listView1.Items[2].SubItems.Add("33");
 this.listView1.Items.Add("ff");
            this.listView1.Items.Add("ff"); this.listView1.Items[3].SubItems.Add("99");
            this.listView1.Items[3].SubItems.Add("99");
 
             //this.listView1.Items[4].SubItems.Add("0");
            //this.listView1.Items[4].SubItems.Add("0"); //this.listView1.Items
            //this.listView1.Items //this.listView1.Items[4].SubItems.Add("77");
            //this.listView1.Items[4].SubItems.Add("77");
 
            }
        }
 private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
        private void listView1_ColumnClick(object sender, ColumnClickEventArgs e) {
        { ColumnSort colSort = new ColumnSort(e.Column);
            ColumnSort colSort = new ColumnSort(e.Column); int iRow = this.listView1.Columns.Count;
            int iRow = this.listView1.Columns.Count; int iCol = this.listView1.Items.Count;
            int iCol = this.listView1.Items.Count;

 colSort.Ascend = (this.listView1.Sorting == SortOrder.Ascending);
            colSort.Ascend = (this.listView1.Sorting == SortOrder.Ascending); if (colSort.Ascend == true)
            if (colSort.Ascend == true) {
            { this.listView1.Sorting = SortOrder.Descending;
                this.listView1.Sorting = SortOrder.Descending; }
            } else
            else {
            { this.listView1.Sorting = SortOrder.Ascending;
                this.listView1.Sorting = SortOrder.Ascending; }
            } //this.listView1.Sort();
            //this.listView1.Sort(); this.listView1.ListViewItemSorter = colSort;
            this.listView1.ListViewItemSorter = colSort; }
        } }
    }
大家仔细看这个Form1类,会发现listview1第四行只有两项,运行程序时当我们点击第一列,第二列进行排序是不会出问题,但是如果我们点击了第三列或者第四列的时候就会抛出ArgumentOutOfRangeException异常,仔细一看我们就明白了,原来第四项根本就只有2个子项,点击第三列或者第四列的时候,listItemA.SubItems[colNum]是根本不存在的,所以程序报错了.经过考虑,我的做法如下,首先判断listviewitem中是否有空项(即不存在的项),如果有则增加一项并将内容初始化为空,然后再进行比较.
在ColumnSort类中的Compare函数中插入如下代码:
 int iColA = listItemA.SubItems.Count;
int iColA = listItemA.SubItems.Count; int iColB= listItemB.SubItems.Count;
            int iColB= listItemB.SubItems.Count; //判断listviewitem中是否有空项,如果有空项则将其置为空,然后再进行比较
            //判断listviewitem中是否有空项,如果有空项则将其置为空,然后再进行比较 if (iColA.CompareTo(iColB) > 0)
            if (iColA.CompareTo(iColB) > 0) {
            { for (int i = 1; i <= iColA - iColB; i++)
                for (int i = 1; i <= iColA - iColB; i++) {
                { listItemB.SubItems.Add("");
                    listItemB.SubItems.Add(""); }
                } }
            } else
            else {
            { for (int j = 1; j <= iColB - iColA; j++)
                for (int j = 1; j <= iColB - iColA; j++) {
                { listItemA.SubItems.Add("");
                    listItemA.SubItems.Add(""); }
                } }
            }现在我们就可以进行比较而不会出现刚才那个错误了.
小结:不知道大家看懂了不,多提点意见了,个人觉得这个还是有点实用的,欢迎指点.
 
                     
                    
                 
                    
                 
    
 
         
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号