【问题标题】:DataGridView Custom Sort in WinFormWinForm中DataGridView自定义排序
【发布时间】:2010-08-18 19:35:12
【问题描述】:

我的 DataGridView 控件当前使用绑定数据的 Sort 属性进行排序,但它并没有按照我想要的方式进行。

我有一个名为 Employee 的列显示为“Firstname Lastname”。

当我按Employee 排序时,Amy Z_Lastname 列在 John A_Lastname 之前,这意味着我更愿意按姓氏排序。

可以将 Employee 字符串分成 3 部分,包括在 DataTable 中,并将排序设置为“Lastname, Firstname”,然后隐藏 Lastname 和 Firstname 列。

宁愿学习如何覆盖默认的 IComparer(或它使用的任何东西),以提供有关如何按我想要的方式排序的说明(我更喜欢的答案)。

【问题讨论】:

    标签: c# sorting datagridview


    【解决方案1】:

    Custom sorting in the DataGridView

    DataGridView 对此一无所知 排名,当然。默认 分拣场景(自动分拣 对于数据绑定列)的调用 DataGridView.Sort() 通过列 标题鼠标单击只是代表 IBindingList 的实现 ApplySort() 在你绑定的列表中 到网格。通常,这个列表 将是一个数据视图。使用我的 ObjectListView 实现,这个 将是任意列表的视图 业务对象。不管怎样,你结束 比较属性 列表中的项目使用 IComparable 的实现 属性类型。

    详情

    PropertyComparers 属性公开 一个 PropertyComparersCollection,它 是属性名称键的字典 和 IComparer 值。你可以更换 属性的 IComparer 使用 PropertyComparersCollection.Add() 方法或索引器(例如 view.PropertyComparers["PropName"] = 我的比较器)。恢复为默认值 IComparable 排序,使用 PropertyComparersCollection.Remove() 方法或将 IComparer 值设置为 通过索引器为 null。

    如果将 IComparer 添加到 PropertyComparers 集合,它将 用于所有后续排序,直到 它从集合中删除或 它被另一个 IComparer 替换。 如果 ObjectListView 已经 在添加 IComparer 时排序 或从 PropertyComparers 中删除, 视图将自动重新排序。

    如果要更改多个 视图后的属性比较器 排序后,可以使用 ObjectListView BeginUpdate() 和 EndUpdate() 方法 抑制 ListChanged 和排序 事件直到所有 IComparers 已更改。这可以防止 多次刷新 数据网格视图。如果 ObjectListView 当时没有排序 IComparers 添加或删除,没有自动 重新排序完成。

    请注意,在对多个进行排序时 列,自定义 IComparer 可以是 与一种排序属性一起使用,并且 默认 IComparable 排序在另一个上。

    例如:

    private void radioButtonSortProgram_CheckedChanged(object sender, EventArgs e)
    
    {
    
        if (this.radioButtonSortProgramAlpha.Checked)
    
            this.view.PropertyComparers["Program"] = new CustomerProgramComparerAlpha();
    
        else if (this.radioButtonSortProgramRank.Checked)
    
            this.view.PropertyComparers["Program"] = new CustomerProgramComparerRank();
    
        else
    
            this.view.PropertyComparers.Remove("Program");
    
    }
    

    【讨论】:

    • 请写一个简短的文章摘要,并附上代码,以防链接失效。看起来您实现了 IComparable,并且要么使用虚拟模式,要么使用自定义列表视图实现。
    • 我给作者发了一个问题。他的解决方案是使用 ObjectListView,但他从未定义它。
    • @jp2code:您可能希望在它到达客户端之前查看排序。我想你一次只能显示一定大小的结果(分页),所以成本真的没有那么高。
    • 我已将此标记为答案,但暂时无法修改我的应用程序以使用此 ObjectListView 控件。如果在我有机会实施 OLV 之前出现更好的答案,我会改变我的答案。谢谢。
    猜你喜欢
    • 2016-03-22
    • 1970-01-01
    • 2021-11-18
    • 2015-05-12
    • 2010-09-30
    • 2010-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    相关资源
    最近更新 更多