using System;
using System.Collections;
using System.Windows.Forms;
//在转载的基础上有所完善
namespace TDRFactory
{
/// <summary>
/// 对ListView点击列标题自动排序功能
/// </summary>
public class ListViewHelper
{
/// <summary>
/// 构造函数
/// </summary>
public ListViewHelper()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public static void ListView_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
{
System.Windows.Forms.ListView lv = sender as System.Windows.Forms.ListView;
// 检查点击的列是不是现在的排序列.
if (e.Column == (lv.ListViewItemSorter as ListViewColumnSorter).SortColumn)
{
// 重新设置此列的排序方法.
if ((lv.ListViewItemSorter as ListViewColumnSorter).Order == System.Windows.Forms.SortOrder.Ascending)
{
(lv.ListViewItemSorter as ListViewColumnSorter).Order = System.Windows.Forms.SortOrder.Descending;
}
else
{
(lv.ListViewItemSorter as ListViewColumnSorter).Order = System.Windows.Forms.SortOrder.Ascending;
}
}
else
{
// 设置排序列,默认为正向排序
(lv.ListViewItemSorter as ListViewColumnSorter).SortColumn = e.Column;
(lv.ListViewItemSorter as ListViewColumnSorter).Order = System.Windows.Forms.SortOrder.Ascending;
}
// 用新的排序方法对ListView排序
((System.Windows.Forms.ListView)sender).Sort();
}
}
/// <summary>
/// 继承自IComparer
/// </summary>
public class ListViewColumnSorter : System.Collections.IComparer
{
/// <summary>
/// 指定按照哪个列排序
/// </summary>
private int ColumnToSort;
/// <summary>
/// 指定排序的方式
/// </summary>
private System.Windows.Forms.SortOrder OrderOfSort;
/// <summary>
/// 声明CaseInsensitiveComparer类对象
/// </summary>
private System.Collections.CaseInsensitiveComparer ObjectCompare;
/// <summary>
/// 构造函数
/// </summary>
public ListViewColumnSorter()
{
// 默认按第一列排序
ColumnToSort = 0;
// 排序方式为不排序
OrderOfSort = System.Windows.Forms.SortOrder.None;
// 初始化CaseInsensitiveComparer类对象
ObjectCompare = new System.Collections.CaseInsensitiveComparer();
}
/// <summary>
/// 重写IComparer接口.
/// </summary>
/// <param name="x">要比较的第一个对象</param>
/// <param name="y">要比较的第二个对象</param>
/// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
public int Compare(object x, object y)
{
int compareResult;
System.Windows.Forms.ListViewItem listviewX, listviewY;
// 将比较对象转换为ListViewItem对象
listviewX = (System.Windows.Forms.ListViewItem)x;
listviewY = (System.Windows.Forms.ListViewItem)y;
string xText = listviewX.SubItems[ColumnToSort].Text;
string yText = listviewY.SubItems[ColumnToSort].Text;
int xInt, yInt;
double xDouble,yDouble;
DateTime xDate, yDate;
// 比较,如果值为IP地址,则根据IP地址的规则排序。
if (IsIP(xText) && IsIP(yText))
{
compareResult = CompareIp(xText, yText);
}
else if (int.TryParse(xText, out xInt) && int.TryParse(yText, out yInt)) //是否全为数字
{
//比较数字
compareResult = CompareInt(xInt, yInt);
}
else if (double.TryParse(xText, out xDouble) && double.TryParse(yText, out yDouble)) //整是否全是浮点型
{
//比较浮点型数字
compareResult = CompareDouble(xDouble, yDouble);
}
else if (int.TryParse(xText, out xInt) && double.TryParse(yText, out yDouble)) //整型和浮点型
{
//比较浮点型数字
compareResult = CompareIntAndDouble(xInt, yDouble);
}
else if (DateTime.TryParse(xText, out xDate) && DateTime.TryParse(yText, out yDate)) //整型和浮点型
{
//比较日期
compareResult = CompareDate(xDate, yDate);
}
else
{
//比较对象
compareResult = ObjectCompare.Compare(xText, yText);
}
// 根据上面的比较结果返回正确的比较结果
if (OrderOfSort == System.Windows.Forms.SortOrder.Ascending)
{
// 因为是正序排序,所以直接返回结果
return compareResult;
}
else if (OrderOfSort == System.Windows.Forms.SortOrder.Descending)
{
// 如果是反序排序,所以要取负值再返回
return (-compareResult);
}
else
{
// 如果相等返回0
return 0;
}
}
/// <summary>
/// 判断是否为正确的IP地址,IP范围(0.0.0.0~255.255.255)
/// </summary>
/// <param name="ip">需验证的IP地址</param>
/// <returns></returns>
public bool IsIP(String ip)
{
return System.Text.RegularExpressions.Regex.Match(ip, @"^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$").Success;
}
/// <summary>
/// 比较两个数字的大小
/// </summary>
/// <param name="ipx">要比较的第一个对象</param>
/// <param name="ipy">要比较的第二个对象</param>
/// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
private int CompareInt(int x, int y)
{
if (x > y)
{
return 1;
}
else if (x < y)
{
return -1;
}
else
{
return 0;
}
}
private int CompareDouble(double x, double y)
{
if (x > y)
{
return 1;
}
else if (x < y)
{
return -1;
}
else
{
return 0;
}
}
private int CompareIntAndDouble(int x, double y)
{
if (x > y)
{
return 1;
}
else if (x < y)
{
return -1;
}
else
{
return 0;
}
}
private int CompareDate(DateTime x, DateTime y)
{
if (x > y)
{
return 1;
}
else if (x < y)
{
return -1;
}
else
{
return 0;
}
}
/// <summary>
/// 比较两个IP地址的大小
/// </summary>
/// <param name="ipx">要比较的第一个对象</param>
/// <param name="ipy">要比较的第二个对象</param>
/// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
private int CompareIp(string ipx, string ipy)
{
string[] ipxs = ipx.Split('.');
string[] ipys = ipy.Split('.');
for (int i = 0; i < 4; i++)
{
if (Convert.ToInt32(ipxs[i]) > Convert.ToInt32(ipys[i]))
{
return 1;
}
else if (Convert.ToInt32(ipxs[i]) < Convert.ToInt32(ipys[i]))
{
return -1;
}
else
{
continue;
}
}
return 0;
}
/// <summary>
/// 获取或设置按照哪一列排序.
/// </summary>
public int SortColumn
{
set
{
ColumnToSort = value;
}
get
{
return ColumnToSort;
}
}
/// <summary>
/// 获取或设置排序方式.
/// </summary>
public System.Windows.Forms.SortOrder Order
{
set
{
OrderOfSort = value;
}
get
{
return OrderOfSort;
}
}
}
}
在窗体加载时调用:
//设置listview,使其可以在单击列头时排序
this.lvProduc.ListViewItemSorter = new ListViewColumnSorter();
this.lvProduc.ColumnClick += new ColumnClickEventHandler(ListViewHelper.ListView_ColumnClick);
分享到:
相关推荐
### 在C#中实现ListView点击列标题自动排序功能详解 #### 概述 在C#开发中,ListView组件是Windows Forms应用中常见的数据展示控件,用于显示列表形式的数据。当用户希望根据某一列的数据进行排序时,实现点击列...
在C#编程中,ListView控件是Windows Forms应用程序中常用的一种...通过理解和实践这些步骤,你就能在C#中实现一个功能完善的ListView循环滚动显示功能。记得根据具体需求进行适当的定制和优化,使其更加符合用户体验。
本篇文章将详细讲解如何实现C# ListView控件按数值进行排序。 首先,理解ListView的基础操作是至关重要的。ListView控件具有多个视图模式,如Details、Small Icons、Large Icons等,其中Details视图最适合展示多列...
在本主题中,我们将深入探讨如何利用C#的ListView控件来实现图标的各种视图显示。 首先,我们需要了解ListView控件的基本结构。ListView包含多个列(Columns)和多个项(Items),每一项又可以有多个子项(SubItems...
该资源参考博客"C#系统应用之ListView实现简单图片浏览器" http://blog.csdn.net/eastmount/article/details/39958829 它主要通过ListView中加载指定文件夹中所有图片并通过双击缩略图显示具体图片,是比较基础的C#...
C# ListView添加行距 源代码 ListView添加行距 一、问题 listview控件,可以实现增大行距吗?行与行太紧了,不好看呀。 有办法可以实现吗? 我不想通过加大字体的方法,因为字体大了,行距还是近呀。 我要的是增大行...
在这个"C# ListView使用例子ListView排列方式演示"中,我们将深入探讨如何利用ListView来展示数据,并对其进行排序。 ListView控件在Windows Forms应用程序中扮演着重要角色,它可以用来显示文件系统、数据库或其他...
很多初级开发着对于C#listView的点击标题头的自动排序都感觉非常麻烦,这里是一个已经开发完毕的listView的第三方控件,可以简单的实现listView的排序的问题。
标题"\"C# ListView中添加ComboBox等控件\"\"指的是如何在ListView的每一行或每一列中添加ComboBox控件,使用户可以在ListView内进行更复杂的操作。这个过程通常涉及到以下几个步骤: 1. **创建ListView控件**:...
标题"**C# Listview固定列宽**"和描述"**c#下实现ListVeiw禁止修改列宽。**"所涉及的知识点主要围绕如何在C#环境下固定`ListView`控件的列宽,并禁用其列宽的动态调整功能。 首先,我们要了解`ListView`控件的基本...
本文将详细介绍如何在C#中实现ListView Group的收缩与扩展功能。 首先,我们要理解ListView Group的概念。在ListView控件中,Group允许我们将相关的项目分组在一起,每个组有自己的头标题,用户可以通过点击标题来...
c#listview示例大全c#listview示例大全c#listview示例大全c#listview示例大全c#listview示例大全c#listview示例大全c#listview示例大全c#listview示例大全c#listview示例大全c#listview示例大全c#listview示例大全c#...
c# listview 使用方法c# listview 使用方法c# listview 使用方法c# listview 使用方法c# listview 使用方法c# listview 使用方法c# listview 使用方法c# listview 使用方法c# listview 使用方法c# listview 使用方法...
本示例项目“C# listView选择项右键菜单下载功能”提供了几个关键功能的实现,包括ListView控件的右键菜单、文件下载进度条以及C#操作Word文件。下面将分别对这些知识点进行详细介绍。 首先,`ListView`是Windows ...
在C#编程中,ListView控件是Windows Forms和WPF应用程序中常见的组件,用于显示数据集,通常以列表或网格的形式。本主题将深入探讨如何在C#的ListView中添加和使用各种自定义控件,如CheckBox和ComboBox,以增强用户...
"带箭头排序的ListView示例"是一个具体的开发实践,它展示了如何在ListView中实现数据的动态排序,并通过箭头图标来指示排序状态。这个示例的核心是通过自定义适配器和点击事件处理来实现功能。 首先,我们需要理解...
在.NET Framework中,C#的ListView控件是一个强大的组件,常用于展示数据列表,它可以以多种视图(如详细信息、小图标、大图标、列表和报告)显示数据。本教程将通过一个简单的C# ListView使用示例,帮助你理解和...
在C# WinForm开发中,ListView控件是一个非常常用且功能强大的组件,它可以用来展示列表式的数据,并且可以通过自定义来实现多种展示效果。在这个特定的案例中,我们讨论的是如何利用ListView控件来实现图片浏览的...
本文将深入探讨如何在C#中实现`ListView`的多列排序功能。 ### 实现多列排序的关键步骤 为了实现`ListView`的多列排序,我们首先需要创建一个符合`IComparer`接口的自定义类,该类用于比较`ListView`项。在这个...
ListView控件是C#编程中常见的一种用户界面元素,它用于显示一组数据的列表或表格形式,常在Windows Forms和WPF应用中使用。在深入理解ListView之前,我们需要先了解其基本概念和组成部分。 1. **ListView控件的...