You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中ListView按列排序:求类似DataGridView的实现方法

在C#中实现ListView按指定列(Name/Last Name)排序

好问题!ListView默认的Sorting属性确实只能按项的默认文本(也就是你提到的Id)排序,要实现按指定列(比如Name、Last Name)排序,得靠自定义比较器来搞定,下面给你具体的实现步骤和代码:

前置准备

首先确保你的ListView是详细视图(Details View),只有这种视图支持多列展示和排序,设置代码如下:

listView_Test.View = View.Details;

步骤1:创建自定义列排序比较器

我们需要写一个继承自IComparer的类,用来实现按指定列的排序逻辑:

public class ListViewColumnSorter : IComparer
{
    // 存储当前要排序的列索引
    private int _sortColumnIndex;
    // 存储当前的排序方向
    private SortOrder _sortDirection;

    public ListViewColumnSorter()
    {
        // 默认初始状态:不排序,按第0列
        _sortColumnIndex = 0;
        _sortDirection = SortOrder.None;
    }

    // 公开属性,用于设置排序列和方向
    public int SortColumnIndex
    {
        set => _sortColumnIndex = value;
        get => _sortColumnIndex;
    }

    public SortOrder SortDirection
    {
        set => _sortDirection = value;
        get => _sortDirection;
    }

    // 核心比较方法,实现列排序逻辑
    public int Compare(object x, object y)
    {
        var itemX = x as ListViewItem;
        var itemY = y as ListViewItem;

        // 处理空项的情况
        if (itemX == null || itemY == null)
            return 0;

        // 比较指定列的文本内容
        int compareResult = string.Compare(itemX.SubItems[_sortColumnIndex].Text, itemY.SubItems[_sortColumnIndex].Text);

        // 根据排序方向调整结果
        return _sortDirection switch
        {
            SortOrder.Ascending => compareResult,
            SortOrder.Descending => -compareResult,
            _ => 0
        };
    }
}

步骤2:在窗体中初始化比较器

在你的窗体类里,实例化这个自定义比较器,并绑定到ListView的ListViewItemSorter属性:

private ListViewColumnSorter _customListViewSorter;

public YourFormName()
{
    InitializeComponent();
    // 初始化自定义排序器
    _customListViewSorter = new ListViewColumnSorter();
    listView_Test.ListViewItemSorter = _customListViewSorter;
}

步骤3:绑定列点击事件触发排序

给ListView的ColumnClick事件添加处理方法,这样用户点击列头时就会触发对应列的排序,还能切换升降序:

private void listView_Test_ColumnClick(object sender, ColumnClickEventArgs e)
{
    // 如果点击的是当前正在排序的列,切换排序方向
    if (e.Column == _customListViewSorter.SortColumnIndex)
    {
        _customListViewSorter.SortDirection = 
            _customListViewSorter.SortDirection == SortOrder.Ascending 
            ? SortOrder.Descending 
            : SortOrder.Ascending;
    }
    else
    {
        // 如果是新列,设置为当前排序列,默认升序
        _customListViewSorter.SortColumnIndex = e.Column;
        _customListViewSorter.SortDirection = SortOrder.Ascending;
    }

    // 触发ListView排序
    listView_Test.Sort();
}

效果说明

这样设置后,当你点击Name列(假设它是第1列),ListView就会按Name列的文本升序/降序排序;点击Last Name列(比如第2列),就会按Last Name列排序,完全解决了你只能按Id排序的问题。

和DataGridView直接调用Sort方法的方式不同,ListView需要通过自定义比较器来实现灵活的多列排序,这是控件本身的设计特性决定的。

内容的提问来源于stack exchange,提问作者Giovanni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 18:42:32