【问题描述】:

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

【解决方法】:

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. js节流函数高级版

    节流函数其主要作用就是防止用户在短时间内多次触发该事件. <!DOCTYPE html> <html lang="en"> <head> < ...

  2. js 获取ISO-8601格式时间字符串的时间戳

    function getTimeStamp(isostr) { var parts = isostr.match(/\d+/g); return new Date(parts[0]+'-'+parts ...

  3. Android中的安全与访问权限控制

    Android是一个多进程系统,在这个系统中,应用程序(或者系统的部分)会在自己的进程中运行.系统和应用之间的安全性是通过Linux的facilities(工具,功能)在进程级别来强制实现的,比如会给 ...

  4. Android学习之DatePicker和TimePicker

    在Android开发的应用程序中,通常都会有时间和日期选择的需求,下面就对日期选择控件DatePicker和时间选择控件TimePicker的基本使用方法进行介绍:        DatePicker ...

  5. Matlab练习——素数查找

    输入数字,0结束,判断输入的数字中的素数 clc; %清空命令行窗口的数据 clear; %清除工作空间的变量 k = ; n = ; %素数的个数 zzs(k) = input('请输入正整数: ' ...

  6. Android 之 布局训练

      1.线性布局 LinearLayout <?xml version="1.0" encoding="utf-8"?> <LinearLay ...

  7. How To MD5SUM --- 如何检查MD5值?

    windows : Hash_1.0.4.exe  可以检查md5 https://help.ubuntu.com/community/HowToMD5SUM Introduction When on ...

  8. rman 中遇到 ORA-01861

    RMAN> run{ 2> sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"'; 3> ...

  9. mysql的root的权限被控制无法授权

    一.环境: MariaDB [(none)]> select version(); +----------------+ | version()      | +---------------- ...

  10. 面试题:应用中很多jar包,比如spring、mybatis、redis等等,各自用的日志系统各异,怎么用slf4j统一输出?(上)

    一.问题概述 如题所说,后端应用(非spring boot项目)通常用到了很多jar包,比如spring系列.mybatis.hibernate.各类连接数据库的客户端的jar包.可能这个jar包用的 ...