关于在ListView的标题上添加排序的问题。

看了好多描述在ListView标题上添加点击排序的文章,也试了好多的方法,有方便的也有麻烦的,有些需要重建整个ListView,有些只需要实现排序的接口。

作为一个懒人,肯定是要找一个又方便又容易看懂的啦,接下来的这个方法我感觉很不错。

PS:实际尝试过程中发现网上的一些方法有一个误区,错误的将int型的值同string型的值一样排序可能会导致排序的错乱,比如初始的文件时8,2,5,1,7 排序以后可能是1,8,2,5,7.

首先创建一个listview,然后将其中的属性——>fullrowselect改为true,MultiSelect改为False,View改为Details,十万分注意的是,此处务必将HeaderStyle改为Clickable,否则标题无法点击。

然后添加listViewProcess_ColumnClick事件。

事件代码如下:

 private int sortColumn = -1;//标识是否已经排序过
        private void listViewProcess_ColumnClick(object sender, ColumnClickEventArgs e)
        {
            //初始化时默认按照升序进行一次排序
            if (e.Column != sortColumn)
            {
                // 如果没有进行排序的话将排序标识改为e.Column
                sortColumn = e.Column;
                // 默认升序.
                listViewProcess.Sorting = SortOrder.Ascending;
            }
            else
            {
                // 判断上一次的排序,再次点击后排序与此相反.
                if (listViewProcess.Sorting == SortOrder.Ascending)
                    listViewProcess.Sorting = SortOrder.Descending;
                else
                    listViewProcess.Sorting = SortOrder.Ascending;
            }

            //进行排序.
            listViewProcess.Sort();
            //将比较器更新到重写的类中进行排序
            this.listViewProcess.ListViewItemSorter = new ListViewItemComparer(e.Column, listViewProcess.Sorting);
        }

重写的类中的代码处理如下:

public class ListViewItemComparer : IComparer
    {
        private int col;
        private SortOrder order;
        public ListViewItemComparer()
        {
            col = 0;
            order = SortOrder.Ascending;
        }
        public ListViewItemComparer(int column, SortOrder order)
        {
            col = column;
            this.order = order;
        }
        public int Compare(object x, object y)
        {
            int returnVal = -1;
            int a = 0, b = 0;
            if (int.TryParse(((ListViewItem)x).SubItems[col].Text, out a) && int.TryParse(((ListViewItem)y).SubItems[col].Text, out b))
            {
                returnVal = a >= b ? (a == b ? 0 : 1) : -1;
                if (order == SortOrder.Descending)
                    returnVal *= -1;
            }
            else
            {
                returnVal = String.Compare(((ListViewItem)x).SubItems[col].Text,
                                        ((ListViewItem)y).SubItems[col].Text);               
                if (order == SortOrder.Descending)                  
                    returnVal *= -1;
            }
            return returnVal;
        }
    }

此处注意如果是整型则先进行Convert以后再排序不会出现排序乱的问题。

posted on 2013-04-22 15:50  浅草才能没马蹄  阅读(337)  评论(0)    收藏  举报

导航