`
ronon
  • 浏览: 192319 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
社区版块
存档分类
最新评论

[转]C# ListView 单击标题实现排序(在转载的基础上有所完善)

    博客分类:
  • .net
阅读更多

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点击列标题自动排序功能.doc

    ### 在C#中实现ListView点击列标题自动排序功能详解 #### 概述 在C#开发中,ListView组件是Windows Forms应用中常见的数据展示控件,用于显示列表形式的数据。当用户希望根据某一列的数据进行排序时,实现点击列...

    c# listview 实现循环滚动显示

    在C#编程中,ListView控件是Windows Forms应用程序中常用的一种...通过理解和实践这些步骤,你就能在C#中实现一个功能完善的ListView循环滚动显示功能。记得根据具体需求进行适当的定制和优化,使其更加符合用户体验。

    c# listview按数值排序 例子

    本篇文章将详细讲解如何实现C# ListView控件按数值进行排序。 首先,理解ListView的基础操作是至关重要的。ListView控件具有多个视图模式,如Details、Small Icons、Large Icons等,其中Details视图最适合展示多列...

    C# ListView实现图标各种视图显示

    在本主题中,我们将深入探讨如何利用C#的ListView控件来实现图标的各种视图显示。 首先,我们需要了解ListView控件的基本结构。ListView包含多个列(Columns)和多个项(Items),每一项又可以有多个子项(SubItems...

    C# 使用ListView控件实现图片浏览器(源代码)

    该资源参考博客"C#系统应用之ListView实现简单图片浏览器" http://blog.csdn.net/eastmount/article/details/39958829 它主要通过ListView中加载指定文件夹中所有图片并通过双击缩略图显示具体图片,是比较基础的C#...

    C# ListView添加行距(ListView 添加行间距)源代码

    C# ListView添加行距 源代码 ListView添加行距 一、问题 listview控件,可以实现增大行距吗?行与行太紧了,不好看呀。 有办法可以实现吗? 我不想通过加大字体的方法,因为字体大了,行距还是近呀。 我要的是增大行...

    C# ListView使用例子ListView排列方式演示

    在这个"C# ListView使用例子ListView排列方式演示"中,我们将深入探讨如何利用ListView来展示数据,并对其进行排序。 ListView控件在Windows Forms应用程序中扮演着重要角色,它可以用来显示文件系统、数据库或其他...

    C#listView自动排序的第三方控件

    很多初级开发着对于C#listView的点击标题头的自动排序都感觉非常麻烦,这里是一个已经开发完毕的listView的第三方控件,可以简单的实现listView的排序的问题。

    C# ListView中添加ComboBox等控件

    标题"\"C# ListView中添加ComboBox等控件\"\"指的是如何在ListView的每一行或每一列中添加ComboBox控件,使用户可以在ListView内进行更复杂的操作。这个过程通常涉及到以下几个步骤: 1. **创建ListView控件**:...

    C# Listview固定列宽

    标题"**C# Listview固定列宽**"和描述"**c#下实现ListVeiw禁止修改列宽。**"所涉及的知识点主要围绕如何在C#环境下固定`ListView`控件的列宽,并禁用其列宽的动态调整功能。 首先,我们要了解`ListView`控件的基本...

    C#实现listview Group收缩扩展的方法

    本文将详细介绍如何在C#中实现ListView Group的收缩与扩展功能。 首先,我们要理解ListView Group的概念。在ListView控件中,Group允许我们将相关的项目分组在一起,每个组有自己的头标题,用户可以通过点击标题来...

    c#listview示例.rar

    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 使用方法...

    C#listView选择项右键菜单下载功能

    本示例项目“C# listView选择项右键菜单下载功能”提供了几个关键功能的实现,包括ListView控件的右键菜单、文件下载进度条以及C#操作Word文件。下面将分别对这些知识点进行详细介绍。 首先,`ListView`是Windows ...

    C# ListView中添加多种自定义控件源码

    在C#编程中,ListView控件是Windows Forms和WPF应用程序中常见的组件,用于显示数据集,通常以列表或网格的形式。本主题将深入探讨如何在C#的ListView中添加和使用各种自定义控件,如CheckBox和ComboBox,以增强用户...

    带箭头排序的ListView示例

    "带箭头排序的ListView示例"是一个具体的开发实践,它展示了如何在ListView中实现数据的动态排序,并通过箭头图标来指示排序状态。这个示例的核心是通过自定义适配器和点击事件处理来实现功能。 首先,我们需要理解...

    C# listview使用demo

    在.NET Framework中,C#的ListView控件是一个强大的组件,常用于展示数据列表,它可以以多种视图(如详细信息、小图标、大图标、列表和报告)显示数据。本教程将通过一个简单的C# ListView使用示例,帮助你理解和...

    c# winform ListView实现图片浏览

    在C# WinForm开发中,ListView控件是一个非常常用且功能强大的组件,它可以用来展示列表式的数据,并且可以通过自定义来实现多种展示效果。在这个特定的案例中,我们讨论的是如何利用ListView控件来实现图片浏览的...

    c# listview实现按多列排序.doc

    本文将深入探讨如何在C#中实现`ListView`的多列排序功能。 ### 实现多列排序的关键步骤 为了实现`ListView`的多列排序,我们首先需要创建一个符合`IComparer`接口的自定义类,该类用于比较`ListView`项。在这个...

    C#之ListView的最佳理解

    ListView控件是C#编程中常见的一种用户界面元素,它用于显示一组数据的列表或表格形式,常在Windows Forms和WPF应用中使用。在深入理解ListView之前,我们需要先了解其基本概念和组成部分。 1. **ListView控件的...

Global site tag (gtag.js) - Google Analytics