按隐藏列排序 DataGridView

3
我有一个绑定了DataSet的BindingSource的DataGridView。对于大多数列,默认排序顺序都很好,但对于其中一列,显示的数据不适合排序,我在DataSet中有一个隐藏的计算列SortCol,用于更好地对该列进行排序。
问题在于,SortCompare(我在其中编写代码以将排序重定向到SortCol)没有被调用。我已经谷歌了几个小时,似乎每个人都说当DataGridView的DataSource属性设置时,不会使用SortCompare - 它希望绑定的DataSource执行排序 - 然后话题就结束了,没有任何关于如何实际执行排序的建议。
我查看了BindingSource和DataSet,但没有看到任何可供进行自定义排序的公开接口。我已经准备好派生自己的BindingSource来完成它,但我希望有一种更简单的方法来完成应该更加直观的操作。
编辑:由于似乎存在一些混淆,我想澄清一下,我不是在问如何对DataSet甚至DataGridView进行初始设置。那很琐碎。我特别询问如何将点击一个列标题与基于另一列(或更一般地按其他条件)进行排序联系起来。
我现在正在尝试使用以编程方式设置为SortMode的方法,因为容易的方法似乎不存在。
更新:无法成功 - 使用一个Sort重载将SortGlyph放在隐藏列上,另一个则会出错:“DataGridView控件是数据绑定的。控件无法使用比较器执行排序操作。”
更新:除非在按其他列排序后设置SortGlyph。我想这就是我将不得不采取的解决方案;尽管我认为我会保留这个问题,以防将来有人提出更好的答案。
1个回答

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事件或来自BindingSourceDataSet的等效事件相比,它仍然感觉有点笨拙,但至少它似乎正在工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接