【问题描述】:

当点击列标题的时候,能够完成对该列排序,同时显示排序的箭头,再次点击,按照反序排序。

【解决方法】:

1、创建一个类:ListViewColumnSorter继承IComparer接口

代码如下:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace CustomerManager
{
    /// <summary>
    /// 对ListView的列进行比较排序
    /// </summary>
    public class ListViewColumnSorter : IComparer
    {
        private int ColumnToSort;  //指定按照哪列排序
        private SortOrder OrderOfSort;  //指定排序的方式
        private CaseInsensitiveComparer ObjectCompare;  //声明CaaseInsensitiveComparer类对象
        public ListViewColumnSorter()  //构造函数
        {
            ColumnToSort = 0;  //默认按第一列排序
            OrderOfSort = SortOrder.None;  //排序
            ObjectCompare = new CaseInsensitiveComparer();  //初始化CaseInsensitiveComparer类对象
        }
        //重写IComparer接口
        //返回比较的结果:如果x=y返回0;如果x>y返回1;如果x<y返回-1
        public int Compare(object x, object y)
        {
            int compareResult;
            ListViewItem listViewX, listViewY;
            //将比较对象转换为ListViewItem对象
            listViewX = (ListViewItem)x;
            listViewY = (ListViewItem)y;
            //比较
            compareResult = ObjectCompare.Compare(listViewX.SubItems[ColumnToSort].Text, listViewY.SubItems[ColumnToSort].Text);
            // 返回比较的结果
            if (OrderOfSort == SortOrder.Ascending)
            {
                // 因为是正序排序,所以直接返回结果
                return compareResult;
            }
            else if (OrderOfSort == SortOrder.Descending)
            {
                // 如果是反序排序,所以要取负值再返回
                return (-compareResult);
            }
            else
            {
                return 0;
            }
        }
        /// 获取并设置按照哪一列排序. 
        public int SortColumn
        {
            set
            {
                ColumnToSort = value;
            }
            get
            {
                return ColumnToSort;
            }
        }
        /// 获取并设置排序方式.
        public SortOrder Order
        {
            set
            {
                OrderOfSort = value;
            }
            get
            {
                return OrderOfSort;
            }
        }
    }
}
2、主窗体中调用
namespace CustomerManager
{
    public partial class MainForm : Form
    {
        private ListViewColumnSorter lvwColumnSorter; 
        public MainForm()
        {
            InitializeComponent();
            lvwColumnSorter = new ListViewColumnSorter();
        }
        //排序
        private void lvwCustomer_ColumnClick(object sender, ColumnClickEventArgs e)
        {
            this.lvwCustomer.Columns[lvwColumnSorter.SortColumn].ImageIndex = 2;
            if (lvwCustomer.Items.Count > 0)
            {
                //设置listView1的排序器
                this.lvwCustomer.ListViewItemSorter = lvwColumnSorter;
                lvwCustomer.Columns[e.Column].ImageIndex = 1;
                if (e.Column == lvwColumnSorter.SortColumn)
                {
                    // 检查点击的列是不是现在的排序列.
                    if (lvwColumnSorter.Order == SortOrder.Ascending)
                    {
                        // 重新设置此列的排序方法.
                        lvwColumnSorter.Order = SortOrder.Descending;
                    }
                    else
                    {
                        // 设置排序列,默认为正向排序
                        lvwColumnSorter.Order = SortOrder.Ascending;
                    }
                }
                else
                {
                    lvwColumnSorter.SortColumn = e.Column;
                    lvwColumnSorter.Order = SortOrder.Ascending;
                }
                // 用新的排序方法对ListView排序
                this.lvwCustomer.Sort();
            }
        } 【注意】:以上实现的对ListView中数据进行列排序,但是没有显示排序箭头,实现显示排序的箭头通过图片替换实现的。
实现排序箭头显示的步骤:
向窗体中添加一个imageList控件,向控件的Images属性中添加箭头上、箭头下和一张透明的图片,然后将imageList1绑定到ListView控件的SmallImageList属性上,
然后设置Column的ImageIndex的值进行图片的替换!

c# 实现ListView的排序的更多相关文章

  1. ListView 分页 排序、编辑、插入和删除

    摘自网络地址:http://msdn.microsoft.com/zh-cn/magazine/cc337984.aspx ListView 基础 ListView 是模板驱动的控件,这意味着它默认情 ...

  2. Delphi的ListView自动排序

    private SortCol: Integer; SortWay: Integer; procedure TForm1.LVweColumnClick(Sender: TObject; Column ...

  3. 点击listview 的列头对其item进行自动排序

    若要自定义排序顺序,必须编写一个实现 IComparer 接口的类,并将 ListViewItemSorter 属性设置为该类的一个对象.当设置 ListViewItemSorter 属性值时,将自动 ...

  4. 《ASP.NET1200例》ListView 控件与DataPager控件的结合<一>

    分页     在前一部分开始时介绍的原 HTML 设计中内含分页和排序,所以根据规范完整实现该网格的任务尚未完成.我们先分页,然后再排序. ListView 控件中的分页通过引入另一个新控件 Data ...

  5. Delphi ListView基本用法大全

    //增加项或列(字段) ListView1.Clear; ListView1.Columns.Clear; ListView1.Columns.Add; ListView1.Columns.Add; ...

  6. Delphi界面篇之ListView控件

    //增加项或列(字段) ListView1.Clear; ListView1.Columns.Clear; ListView1.Columns.Add; ListView1.Columns.Add; ...

  7. Android-Universal-Image-Loader使用介绍

    简介 Android上最让人头疼的莫过于从网络获取图片.显示.回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你.Universal Image Loader for Android的目的 ...

  8. C# listview 单击列头实现排序 <二>

    单击列头实现排序,首先在羡慕中添加下面的帮助实现的类:具体的代码: using System; using System.Collections; using System.Windows.Forms ...

  9. SlideAndDragListView,一个可排序可滑动item的ListView

    SlideAndDragListView简介 SlideAndDragListView,可排序.可滑动item显示"菜单"的ListView. SlideAndDragListVi ...

随机推荐

  1. Windows系统下运行某些程序时缺少“Msflxgrd.ocx”的解决方法

    出现这样的错误就是系统缺少相应的库文件,我们安装即可. 下载Msflxgrd.ocx,这里提供一个下载网址:https://www.ocxme.com/files/msflxgrd_ocx 64位系统 ...

  2. 服务端测试之接口测试工具——postman

    今天跟大家分享一个非常常见大家也非常熟悉的测试工具——postman. 1.安装postman postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件.打开chrome浏览器, ...

  3. 使用librtmp进行H264与AAC直播

    libx264 版本是 128libfaac 版本是 1.28 1.帧的划分 1.1 H.264 帧 对于 H.264 而言每帧的界定符为 00 00 00 01 或者 00 00 01. 比如下面的 ...

  4. httpClient创建对象、设置超时

    从老版本和新版本进行比较说明: 1.创建HttpClient对象 3.X: HttpClient httpClient = new DefaultHttpClient(); 4.3: Closeabl ...

  5. composer安装指定版本的laravel

    composer create-project laravel/laravel blog 4.2.*

  6. IE6/IE7/IE8下float:right的异常及其解决方法

    1.最简单的方法就是调换顺序,将需要右浮动的元素写在前面.写成这样:<h2><a href="#">更多>></a>小标题</ ...

  7. mvc4 初体验(一)

    [AllowAnonymous] [AllowAnonymous] 属性,允许匿名 在BaseControler里面加一个[Authorize],所有要验证的页面都继承BaseControler, 不 ...

  8. js 的空值判断程序

    function empty(v){ switch (typeof v){ case 'undefined' : return true; case 'string' : if($.trim(v).l ...

  9. Elasticsearch 学习之 分片未分配原因

    分片未分配的原因主要有: 1)INDEX_CREATED:由于创建索引的API导致未分配.2)CLUSTER_RECOVERED :由于完全集群恢复导致未分配.3)INDEX_REOPENED :由于 ...

  10. Elasticsearch学习之查询去重

    1. 实现查询去重.分页,例如:实现依据qid去重,createTime排序,命令行为: GET /nb_luban_answer/_search { "query": { &qu ...