2008-11-10 147 views
4

我有一個綁定到DataTable的DataGridView。我有一列是一個僞int,你知道這種類型,大多數情況下它有整數,但有時卻有一個N/A。這個列是一個varchar,但我想要它像一個int列那樣排序,將N/A視爲-1。綁定DataGridView的自定義排序

DataGridView爲此提供了 - 如果它沒有綁定到DataTable。如果綁定,它使用綁定對象的排序機制,而D​​ataTables不公開該功能。

我可以使用我想要的行爲在DataTable中創建一個自定義列,但由於DataGridView綁定到DataTable,因此它會按顯示的列進行排序。我可以在DataGridView中創建一個自定義列,但是當我已經有一個主要工作的解決方案時,我需要將該表設置爲虛擬模式進行排序。

我該如何對它進行排序我想要的我的僞int列 - 在可能的情況下,通過int排序?這種情況看起來像是非常常見的,我相信它已經被提供了。

回答

1

嘗試綁定到數據視圖,不是的DataTable,如:

private void SortByTwoColumns() 
{ 
    DataView myDataView = DataTable1.DefaultView; 
    myDataView.Sort = "State, ZipCode DESC"; 
    myGridView.DataSource = myDataView; 
} 

你有N個處理/ A數據的幾個選擇 - 選擇聲明,RowPrePaint事件, 和更多。

+0

我不明白這是如何解決我的問題。它已經綁定到默認視圖,並且按兩列排序只會持續到用戶首次單擊列標題並對錶進行排序爲止。 DataGridView *更改* Sort屬性。 – Merus 2008-11-10 06:21:06

+0

您可以根據用戶點擊(捕獲事件)並修改DataGridView行爲來適應您的需要。 – gimel 2008-11-10 07:02:40

1

爲什麼不只是將SQL查詢更改爲int(-1代表'N/A'),然後使用自定義格式化程序顯示列?

3

當我不得不應付排序類似這樣的問題,我最喜歡的方法是向DataTable添加一列並將僞int分析爲我想要的可排序int。然後在DataGridView的綁定中,您可以簡單地隱藏該列數據,但由於它在那裏,您仍然可以對其進行排序。它爲內存添加了一些額外的數據來完成這個任務,所以根據性能命中和排序數據的大小,這可能是一個潛在的問題。此外,無論何時數據被修改,您都需要確保這個額外的列保持一致。

0

除了Joel Etherton的回答,還有一個事件可以處理,它可以覆蓋單元格的顯示值。

所以,就像他說的,你會需要兩列。一個是強類型的數字列,其文本值爲-1s。另一個是帶有真實值的隱藏文本列(混合數字和文本值)。按原樣排序,但用戶將看到-1s而不是實際值。

爲了解決這個問題,我們需要這樣的代碼:

Private Sub dgDisplay_CellFormatting(ByVal sender As Object, _ 
ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) _ 
Handles dgDisplay.CellFormatting 
    If Not (e.ColumnIndex = dgDisplay.Columns("NumericColumn").Index _ 
    AndAlso e.RowIndex >= 0) Then Exit Sub 

    Dim newVal As String = dgDisplay.Item("ActualColumn", e.RowIndex).Value 
    e.Value = newVal 
End Sub 

這將顯示你想看到的實際文本值,即使在結合DataSource值僅僅是一個數字。

如果您打算對後面的DataView執行任何篩選,請確保您在隱藏列上篩選。