当前位置: 首页 > news >正文

套路化编程:C# winform ListView 自定义排序

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。

源码指引:github源码指引_初级代码游戏的博客-CSDN博客


        ListView是可以默认排序的,但排序规则只能是字符串。但我们一般标准的排序行为是单击列头排序、区分字符串和数字、连续单击列头改变排序顺序,而且最好是稳定排序(改变排序的列原顺序尽量不变)。

        下面是一个排序实现的套路,排序类无需修改即可用于多个ListView。

目录

一、ListView的排序接口

二、排序类

三、处理列头单击事件


一、ListView的排序接口

        ListView支持改变排序行为,通过设置排序属性ListViewItemSorter来实现。

			sorter = new mySorter();//为ListViewItemSorter指定排序类listView_picture.ListViewItemSorter = sorter;sorter.SortOrder = SortOrder.Ascending;sorter.SortColumn = 0;sorter.SortAsNumber = true;

        以上代码中mySorter是我们自己定义的排序对象,带有三个属性,分别控制排序顺序、排序列和是否是数字规则。

        如果ListView设置为自动排序的,则上述代码已经可以实现排序。如果不是自动排序,则需要调用Sort方法来排序,在调用之前可以改变排序规则。

二、排序类

	public class mySorter : System.Collections.IComparer{public mySorter(){SortColumn = 0;SortOrder = SortOrder.None;SortAsNumber = false;}//指定进行排序的列public int SortColumn { get; set; }//指定按升序或降序进行排序public SortOrder SortOrder { get; set; }//指定按照数字规则排序public bool SortAsNumber { get; set; }public int Compare(object x, object y){int CompareResult;ListViewItem itemX = (ListViewItem)x;ListViewItem itemY = (ListViewItem)y;if (SortAsNumber){double result = Convert.ToDouble(itemX.SubItems[SortColumn].Text) - Convert.ToDouble(itemY.SubItems[SortColumn].Text);CompareResult = result < 0 ? -1 : (result > 0 ? 1 : 0);}else{CompareResult = itemX.SubItems[SortColumn].Text.CompareTo(itemY.SubItems[SortColumn].Text);}return SortOrder == SortOrder.Ascending ? CompareResult : SortOrder == SortOrder.Descending ? -CompareResult : 0;}}

        排序类是IComparer的实现,重点是Compare方法。

        这个类还有一点简单,不能支持多列排序。

        多列排序需要记住之前排序的列,然后逐个比较,代码会有一点复杂。

三、处理列头单击事件

        前面的代码已经可以排序,如果要根据用户操作来排序,则需要处理列头单击事件。

		private void listView1_ColumnClick(object sender, ColumnClickEventArgs e){if (e.Column == this.sorter.SortColumn){if (this.sorter.SortOrder == SortOrder.Ascending)this.sorter.SortOrder = SortOrder.Descending;elseif (this.sorter.SortOrder == SortOrder.Descending)this.sorter.SortOrder = SortOrder.Ascending;elsereturn;}else{this.sorter.SortColumn = e.Column;}this.listView1.Sort();}

         这个代码判断被单击的列和上次的是否相同,相同则改变排序顺序。


(这里是文档结束)

http://www.xdnf.cn/news/464095.html

相关文章:

  • 5款AI驱动的MySQL数据库管理工具:提升运维效率的智能之选
  • 数智化招标采购系统如何实现分散评标?
  • Git/GitLab日常使用的命令指南来了!
  • Python——文件、异常、模块与包
  • 深入理解浏览器中的 window、document 和 window.parent
  • HarmonyOs开发之———UIAbility进阶
  • NVIDIA Omniverse 现已支持中文!
  • 问题处理——在ROS2(humble)+Gazebo+rqt下,无法显示仿真无人机的相机图像
  • 【LLIE专题】基于码本先验与生成式归一化流的低光照图像增强新方法
  • 【JS】vue3中组件命名问题
  • 世界模型+大模型+自动驾驶 论文小汇总
  • 测试--BUG(软件测试⽣命周期 bug的⽣命周期 与开发产⽣争执怎么办)
  • 深入解析CountDownLatch的设计原理与实现机制
  • VBA_NZ系列工具NZ10:VBA压缩与解压工具
  • spring boot Controller 和 RestController 的区别
  • 第三章:JavaScript引擎 · 行为之火
  • 深入解析HTTP协议演进:从1.0到3.0的全面对比
  • CSP-J/S初赛知识点:计算机网络与Internet基本概念知识点
  • 在C++模板中,设置一个无名模板参数的默认值为0到底是什么含义
  • repmgr集群故障修复
  • 基于DWT的音频水印算法
  • 2025长三角杯数学建模B题教学思路分析:空气源热泵供暖的温度预测
  • Java转Go日记(三十六):简单的分布式
  • 【PmHub后端篇】PmHub中Seata分布式事务保障任务审批状态一致性
  • 【油藏地球物理正演软件ColchisFM】基于数据驱动的油藏参数叠前地震反演研究进展
  • Scrapy框架下地图爬虫的进度监控与优化策略
  • 智能化招标采购新基建:基于DeepSeek大模型+RAG技术的智能知识服务中枢
  • MinerU安装(pdf转markdown、json)
  • uniapp在APP上如何使用websocket--详解
  • 每日算法刷题计划Day7 5.15:leetcode滑动窗口4道题,用时1h