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 ...
随机推荐
- Winform判断EventHandler是否已经添加
斜体部分替换成自己需要的 private bool HasValueChangedEventHandler(DateTimePicker b) { FieldInfo f1 = typeof(Date ...
- java中的编码和编码格式问题
看来问的人和回答的人都不一定清楚什么是“编码和编码格式”,以及如何理解“java中字符串的编码”;首先明确几点: unicode是一种“编码”,所谓编码就是一个编号(数字)到字符的一种映射关系,就仅仅 ...
- Linux应急响应(四):盖茨木马
0x00 前言 Linux盖茨木马是一类有着丰富历史,隐藏手法巧妙,网络攻击行为显著的DDoS木马,主要恶意特点是具备了后门程序,DDoS攻击的能力,并且会替换常用的系统文件进行伪装.木马得名于其 ...
- 团购已满,O2O只是个笑话吗?
团购的用户习惯经过多年的“发酵”以后,大多数用户的团购习惯已经养成,同样一张电影票团购和直接现场购买的差价在一倍以上,当然O2O领域的其他情况也差不多,面对明显的“优惠”,用户当然乐意使用团购服务. ...
- JSPatch实现原理详解<二>
本文转载至 http://blog.cnbang.net/tech/2855/ 距离上次写的<JSPatch实现原理详解>有一个月的时间,在这段时间里 JSPatch 在不断地完善和改进, ...
- VC调用DLL
VC调用DLL 调用DLL有两种方法:静态调用和动态调用. (一).静态调用其步骤如下: 1.把你的youApp.DLL拷到你目标工程(需调用youApp.DLL的工程)的Debug目录下; 2. ...
- Android学习之Handler消息
Android系统规定,一些耗时的操作不能放在UI线程中去执行,这样会报一个ANR错误.所以为了避免该问题,我们需要开启一个新的线程去执行一些耗时操作:开启新的线程,将耗时的操作在新线程里面去执行, ...
- 【cs229-Lecture12】K-means算法
上课内容: 无监督学习: K-means聚类算法 混合高斯模型 jensen不等式(用于推导出EM算法的一般形式) EM(Expectation Maximization)算法(最大期望算法) K-m ...
- C# 反射的深入了解
Assembly.Load("")的使用说明如下; 并不是命名空间.常用的是程序集名称,也就是dll的名称 关于反射Assembly.Load("程序集" ...
- bs-loading
根据bootstrap的modal来显示loading动效. 核心内容: 1.图片转base64方法: // 图片压缩-start function run(input_file,get_data){ ...