zoukankan      html  css  js  c++  java
  • c# 实现ListView的排序

    【问题描述】:

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

    【解决方法】:

    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的值进行图片的替换!
  • 相关阅读:
    Spring Security -- 添加图形验证码(转载)
    Spring Security -- 自定义用户认证(转载)
    pandas agg 后降低df表层
    判断是否有人跟踪车辆的方案
    格隆汇笔记-黄勇演讲
    Mac mysql 忘记root密码的解决方法
    sql 同步2个表中的一个字段数据
    Linux下配置用msmtp和mutt发邮件
    spark StructType的应用,用在处理mongoDB keyvalue
    Idea2018旗舰版破解方法
  • 原文地址:https://www.cnblogs.com/wxfsoft/p/3433316.html
Copyright © 2011-2022 走看看