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的值进行图片的替换!
c# 实现ListView的排序的更多相关文章
- ListView 分页 排序、编辑、插入和删除
摘自网络地址:http://msdn.microsoft.com/zh-cn/magazine/cc337984.aspx ListView 基础 ListView 是模板驱动的控件,这意味着它默认情 ...
- Delphi的ListView自动排序
private SortCol: Integer; SortWay: Integer; procedure TForm1.LVweColumnClick(Sender: TObject; Column ...
- 点击listview 的列头对其item进行自动排序
若要自定义排序顺序,必须编写一个实现 IComparer 接口的类,并将 ListViewItemSorter 属性设置为该类的一个对象.当设置 ListViewItemSorter 属性值时,将自动 ...
- 《ASP.NET1200例》ListView 控件与DataPager控件的结合<一>
分页 在前一部分开始时介绍的原 HTML 设计中内含分页和排序,所以根据规范完整实现该网格的任务尚未完成.我们先分页,然后再排序. ListView 控件中的分页通过引入另一个新控件 Data ...
- Delphi ListView基本用法大全
//增加项或列(字段) ListView1.Clear; ListView1.Columns.Clear; ListView1.Columns.Add; ListView1.Columns.Add; ...
- Delphi界面篇之ListView控件
//增加项或列(字段) ListView1.Clear; ListView1.Columns.Clear; ListView1.Columns.Add; ListView1.Columns.Add; ...
- Android-Universal-Image-Loader使用介绍
简介 Android上最让人头疼的莫过于从网络获取图片.显示.回收,任何一个环节有问题都可能直接OOM,这个项目或许能帮到你.Universal Image Loader for Android的目的 ...
- C# listview 单击列头实现排序 <二>
单击列头实现排序,首先在羡慕中添加下面的帮助实现的类:具体的代码: using System; using System.Collections; using System.Windows.Forms ...
- SlideAndDragListView,一个可排序可滑动item的ListView
SlideAndDragListView简介 SlideAndDragListView,可排序.可滑动item显示"菜单"的ListView. SlideAndDragListVi ...
随机推荐
- js节流函数高级版
节流函数其主要作用就是防止用户在短时间内多次触发该事件. <!DOCTYPE html> <html lang="en"> <head> < ...
- js 获取ISO-8601格式时间字符串的时间戳
function getTimeStamp(isostr) { var parts = isostr.match(/\d+/g); return new Date(parts[0]+'-'+parts ...
- Android中的安全与访问权限控制
Android是一个多进程系统,在这个系统中,应用程序(或者系统的部分)会在自己的进程中运行.系统和应用之间的安全性是通过Linux的facilities(工具,功能)在进程级别来强制实现的,比如会给 ...
- Android学习之DatePicker和TimePicker
在Android开发的应用程序中,通常都会有时间和日期选择的需求,下面就对日期选择控件DatePicker和时间选择控件TimePicker的基本使用方法进行介绍: DatePicker ...
- Matlab练习——素数查找
输入数字,0结束,判断输入的数字中的素数 clc; %清空命令行窗口的数据 clear; %清除工作空间的变量 k = ; n = ; %素数的个数 zzs(k) = input('请输入正整数: ' ...
- Android 之 布局训练
1.线性布局 LinearLayout <?xml version="1.0" encoding="utf-8"?> <LinearLay ...
- How To MD5SUM --- 如何检查MD5值?
windows : Hash_1.0.4.exe 可以检查md5 https://help.ubuntu.com/community/HowToMD5SUM Introduction When on ...
- rman 中遇到 ORA-01861
RMAN> run{ 2> sql 'alter session set nls_date_format="yyyy-mm-dd hh24:mi:ss"'; 3> ...
- mysql的root的权限被控制无法授权
一.环境: MariaDB [(none)]> select version(); +----------------+ | version() | +---------------- ...
- 面试题:应用中很多jar包,比如spring、mybatis、redis等等,各自用的日志系统各异,怎么用slf4j统一输出?(上)
一.问题概述 如题所说,后端应用(非spring boot项目)通常用到了很多jar包,比如spring系列.mybatis.hibernate.各类连接数据库的客户端的jar包.可能这个jar包用的 ...