【问题描述】:

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

【解决方法】:

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. nvm-windows的安装配置

    首先建议把你之前安装的node.js的msi版本给卸载掉. 然后下载nvm-windows并按照默认配置一步步安装 由于国外的镜像源下载慢,所以打开C:\Users\dell\AppData\Roam ...

  2. ios开发之--通过通知监听textfield的输入状态,判断按钮的状态

    第一步: _rightBtn = [UIButton buttonWithType:UIButtonTypeCustom]; _rightBtn.frame = CGRectMake(kWidth - ...

  3. Kubernetes 相关概念

    Node: (1) Node(节点)也就是宿主机,宿主机可以是物理机 .云主机 .虚拟机等等,我们可以在一个宿主机上跑多个容器(container)(2) Node 上会被分配一些工作负载(即 doc ...

  4. Bootstrap学习总结笔记(24)-- 基于BootstrapValidator的Form表单验证

    Form表单进行数据验证是十分必要的,我们可以自己写JS脚本或者使用JQuery Validate 插件来实现.对于Bootstrap而言,利用BootstrapValidator来做Form表单验证 ...

  5. mysql在命令行模式下创建数据库时要显式指定字符集

    create database db1 DEFAULT CHARACTER SET utf8 COLLATE utf8_chinese_ci;

  6. Cent OS 常用命令搜集

    打开一个 Shadowsocks 配置文件nano /etc/shadowsocks.json 重启 Shadowsocks/etc/init.d/shadowsocks restart centos ...

  7. django rest framwork教程之 viewsets和routers

    ViewSets 和Routers REST框架包括一个用于抽象处理的ViewSets,允许开发人员集中精力对API的状态和交互进行建模,并根据常见约定自动处理URL构造. Viewset 类和 Vi ...

  8. <转>机器学习系列(9)_机器学习算法一览(附Python和R代码)

    转自http://blog.csdn.net/han_xiaoyang/article/details/51191386 – 谷歌的无人车和机器人得到了很多关注,但我们真正的未来却在于能够使电脑变得更 ...

  9. Python学习(21):Python函数(5):变量作用域与闭包

    转自 http://www.cnblogs.com/BeginMan/p/3179040.html 一.全局变量与局部变量 一个模块中,最高级别的变量有全局作用域. 全局变量一个特征就是:除非被删除, ...

  10. c++ 友元类 与 友元类派生类

    定义: 当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问.我们就把类B叫做类A的友元. 用法: 在A类中加入: friend class B; 下面这个程序说明 ...