DataGridView自定义排序WinForm

问题描述:

我的DataGridView控件当前使用绑定数据的Sort属性进行排序,但它没有按照我希望的方式进行。DataGridView自定义排序WinForm

我有一列名为Employee的列显示为“名字姓氏”。

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

可能将雇员字符串分成3部分,包括DataTable中的那些,并将排序设置为“姓氏,名字”,然后隐藏姓氏和名字列。

我想宁可了解如何覆盖默认的IComparer(或任何它使用),以提供如何排序我想要的方式(我更喜欢的答案)的说明。

Custom sorting in the DataGridView

DataGridView的什么也不知道,这当然 排名。通过列 头鼠标点击调用 DataGridView.Sort()简单地委托给 的默认排序 方案(自动分拣 的数据绑定列)在你已经绑定列表中的IBindingList的实施 ApplySort()的 到电网。通常,这个列表 将是一个DataView。使用我的 ObjectListView实现,这个 将是一个任意的业务对象列表的视图。无论采用哪种方式,您都可以通过使用 属性类型的IComparable实现比较列表中 项目的属性,结束 。

详细

的PropertyComparers属性公开 一个PropertyComparersCollection,这是 属性名键 和的IComparer值的字典。您可以使用PropertyComparersCollection.Add() 方法或索引器(例如 view.PropertyComparers [“PropName”] = myComparer)替换 属性的IComparer。要恢复默认的 IComparable排序,请使用 PropertyComparersCollection.Remove() 方法或通过索引器将IComparer值设置为 null。

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

如果你想被 分类视图后 财产comparers更改多个,您可以使用ObjectListView 的BeginUpdate()和EndUpdate()方法 打压的ListChanged和排序 事件,直到所有的IComparers 有被改变了。这可以防止 DataGridView的多次刷新。如果在添加或删除IComparers 时没有对ObjectListView 进行排序,则不会自动执行 重新排序。

注意,在多个排序 列时,自定义的IComparer可以用一个类型的属性使用 ,而在另一 默认排序IComparable的。

e.g:

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"); 

} 
+1

请写文章的一个简短的摘要,有代码,在链接腐烂的情况。看起来像你实现了IComparable,并且使用虚拟模式,或者使用自定义列表视图实现。 – 2010-08-18 19:52:42

+0

我已发送作者一个问题。他的解决方案是使用ObjectListView,但他从来没有定义它。 – jp2code 2010-08-18 19:57:21

+0

+1 w/digest – 2010-08-18 20:15:03