2015-09-16 90 views
3

排序的DataGridView我有一個綁定到被綁定到一個DataSet一個BindingSourceDataGridView。對於大多數列,默認的排序順序沒問題,但對於其中一列,顯示的數據不適合排序,並且我在DataSet中有一個隱藏的計算列SortCol,以便爲該列做出更好的排序。通過隱藏列

問題是,SortCompare,其中我有代碼重定向排序SortCol不會被調用。我一直在谷歌搜索幾個小時,似乎每個人都說SortCompareDataSource屬性設置爲DataGridView - 它期望約束DataSource執行排序時不使用SortCompare - 然後主題被刪除,沒有任何關於如何實際執行排序的建議。

我查看了BindingSourceDataSet,我沒有看到任何公開的接口用於自定義排序。我一切都會設法推出我自己的BindingSource來做到這一點,但我希望有一種方法可以讓你更輕鬆地做出更直接的事情。

編輯:由於似乎有一些混淆,我想澄清,我不問如何執行DataSet或甚至在DataGridView上的初始設置。這是微不足道的。我具體詢問如何將點擊一列標題鏈接到另一列的排序(或者更一般地通過其他標準)。

我現在正在研究是否可以使用Programmatically設置爲SortMode,因爲簡單的方法似乎不存在。

UPDATE:沒有骰子 - 使用一個Sort超載穿隱藏列SortGlyph,對方給出了一個錯誤:DataGridView control is data-bound. The control cannot use the comparer to perform the sort operation.

UPDATE:除非你設置SortGlyph排序由另一列。我想這就是我必須解決的問題。儘管我想我會保持開放以防其他人提出更好的答案供將來參考。

回答

2

我終於用於此的解決方案是設置SortModeProgrammatic和處理「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的等價物,但至少它似乎正在工作。