我有DataGridView
绑定到绑定到BindingSource
的{{1}}。对于大多数列,默认排序顺序很好,但对于其中一列,显示的数据不适合排序,我在{{1}中有一个隐藏的计算列DataSet
为该列做出更好的排序。
问题是SortCol
,我有代码将排序重定向到DataSet
没有被调用。我已经谷歌搜索了几个小时,似乎每个人都说在SortCompare
设置SortCol
属性时SortCompare
未被使用 - 它期望绑定DataSource
执行排序 - 然后删除主题,而不提供有关如何实际执行排序的任何建议。
我查看了DataGridView
和DataSource
,我没有看到任何公开的界面进行自定义排序。我已准备好派出自己的BindingSource
来做这件事了,但是我希望有一种不那么令人头疼的事情。简单。
编辑:由于似乎存在一些混淆,我想澄清一点,我不是在询问如何在DataSet
或BindingSource
上执行初始设置。这是微不足道的。我特别询问如何将点击一个列标题链接到基于另一列的排序(或更一般地通过其他标准)。
我现在正在研究是否可以将DataSet
设置为DataGridView
,因为简单的方法似乎不存在。
更新:没有骰子 - 使用一次Programmatically
重载会将SortMode
放在隐藏列上,另一个则会出错:Sort
更新:除非您在之后将SortGlyph
设置为另一列。我想这就是我必须采用的解决方案;虽然我认为如果其他人想出一个更好的答案以供将来参考,我会保持开放状态。
答案 0 :(得分:2)
我最终使用的解决方案是将SortMode
设置为Programmatic
并处理' ColumnHeaderMouseClick'事件如下:
Private Sub DG_ColumnHeaderMouseClick(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellMouseEventArgs) Handles DG.ColumnHeaderMouseClick
If DG.Columns(e.ColumnIndex) Is NonSortColumn Then
Select Case NonSortColumn.HeaderCell.SortGlyphDirection
Case SortOrder.Ascending
DG.Sort(SortColumn, System.ComponentModel.ListSortDirection.Descending)
NonSortColumn.HeaderCell.SortGlyphDirection = SortOrder.Descending
Case Else
DG.Sort(SortColumn, System.ComponentModel.ListSortDirection.Ascending)
NonSortColumn.HeaderCell.SortGlyphDirection = SortOrder.Ascending
End Select
End If
End Sub
与处理SortCompare
事件或来自BindingSource
或DataSet
的同等事件相比,它仍然感觉像是一个混乱,但至少它似乎有效。< / p>