Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WinForm中的DataGridView自定义排序_C#_Sorting_Datagridview - Fatal编程技术网

C# WinForm中的DataGridView自定义排序

C# WinForm中的DataGridView自定义排序,c#,sorting,datagridview,C#,Sorting,Datagridview,我的DataGridView控件当前使用绑定数据的Sort属性进行排序,但它没有执行我希望它执行的操作 我有一个名为Employee的列,显示为“Firstname Lastname” 当我按员工排序时,Amy Z_Lastname列在John A_Lastname之前,这意味着我更喜欢按姓氏排序 我可以将Employee字符串分成3部分,包括DataTable中的部分,并将排序设置为“Lastname,Firstname”,然后隐藏Lastname和Firstname列 我宁愿学习如何覆盖默认

我的DataGridView控件当前使用绑定数据的Sort属性进行排序,但它没有执行我希望它执行的操作

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

当我按
员工
排序时,Amy Z_Lastname列在John A_Lastname之前,这意味着我更喜欢按姓氏排序

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

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

DataGridView对此一无所知 当然是排名。默认值 排序方案(自动排序) 对于数据绑定列),调用 DataGridView.Sort()通过列 标题鼠标单击,只需将其委托给 的IBindingList实现 已绑定列表中的ApplySort() 到网格。通常,这个列表 将是一个数据视图。用我的 ObjectListView实现,此 将是一个任意列表的视图 业务对象。不管怎样,你都要结束 上一步比较了 使用 可比较的 属性类型

详细信息

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

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

如果要更改多个 创建视图后的属性比较器 排序后,可以使用ObjectListView BeginUpdate()和EndUpdate()方法 要抑制列表,请更改并排序 事件,直到所有IComparers 已经改变了。这防止了 多次刷新 DataGridView。如果ObjectListView 在IComparers时未排序 添加或删除,没有自动 重新排序完成

请注意,在对多个 列,可以创建自定义的IComparer 与一个排序属性一起使用,并且 另一个上的默认IComparable排序

e、 g:


请写一篇简短的文章摘要,并附上代码,以防链接崩溃。看起来您实现了IComparable,或者使用虚拟模式,或者使用自定义列表视图实现。我向作者发送了一个问题。他的解决方案是使用ObjectListView,但他从未定义它。@jp2code:您可能希望在它到达客户端之前查看排序。我想您一次只能显示一定大小的结果(分页),因此成本并没有那么高。我已将此标记为答案,但我暂时无法修改我的应用程序以使用此ObjectListView控件。如果在我有机会实现OLV之前有更好的答案出现,我将改变我的答案。谢谢
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");

}