C# listview实现排序实例

一.先在你的工程中增加类ListViewHelper.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ListViewHelpertest.CentreWin
{
public class ListViewHelper
{
///
/// 构造函数
///
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();
}
}
///
/// 继承自IComparer
///
public class ListViewColumnSorter : System.Collections.IComparer
{
///
/// 指定按照哪个列排序
///
private int ColumnToSort;
///
/// 指定排序的方式
///
private System.Windows.Forms.SortOrder OrderOfSort;
///
/// 声明CaseInsensitiveComparer类对象
///
private System.Collections.CaseInsensitiveComparer ObjectCompare;
///
/// 构造函数
///
public ListViewColumnSorter()
{
// 默认按第一列排序
ColumnToSort = 1;
// 排序方式为不排序
OrderOfSort = System.Windows.Forms.SortOrder.Descending;
// 初始化CaseInsensitiveComparer类对象
ObjectCompare = new System.Collections.CaseInsensitiveComparer();
}

    /// <summary>
    /// 构造函数
    /// </summary>
    public ListViewColumnSorter(int x)
    {
        // 默认按第一列排序
        ColumnToSort = x;
        // 排序方式为不排序
        OrderOfSort = System.Windows.Forms.SortOrder.Ascending;
        // 初始化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;
        // 比较,如果值为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
        {
            //比较对象
            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;
        }
    }
    /// <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;
        }
    }





}

}

二.在窗口加载的地加上下面两句,就可能实现排列了。
private void Operating_record_Load(object sender, EventArgs e)
{

        this.listView1.ListViewItemSorter = new ListViewHelpertest.CentreWin.ListViewColumnSorter();
        this.listView1.ColumnClick += new ColumnClickEventHandler(ListViewHelpertest.CentreWin.ListViewHelper.ListView_ColumnClick);

    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZCY5202015

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值