Windows Form DataGridView 控制項中的資料行排序模式
DataGridView 資料行有三種排序模式。 每個資料行的排序模式都是透過 SortMode 資料行的 屬性來指定,其可設定為下列 DataGridViewColumnSortMode 其中一個列舉值。
DataGridViewColumnSortMode 值 |
描述 |
---|---|
Automatic | 文字方塊資料行的預設值。 除非使用資料行標頭進行選取,否則按一下資料行標頭會自動依這個資料行排序 DataGridView ,並顯示表示排序次序的字元。 |
NotSortable | 非文字方塊資料行的預設值。 您可以以程式設計方式排序此資料行;不過,它不適用於排序,因此不會保留任何空間給排序圖像。 |
Programmatic | 您可以以程式設計方式排序此資料行,並將空間保留給排序字元。 |
如果資料行包含可有意義排序的值,您可能會想要變更預設 NotSortable 為 的排序模式。 例如,如果您的資料庫資料行包含代表專案狀態的數位,您可以將影像資料行系結至資料庫資料行,將這些數字顯示為對應的圖示。 然後,您可以將數值資料格值變更為 事件處理常式 DataGridView.CellFormatting 中的影像顯示值。 在此情況下,將 屬性設定為 SortModeAutomatic 可讓使用者排序資料行。 自動排序可讓使用者將具有相同狀態的專案分組,即使對應至數位的狀態沒有自然序列也一樣。 核取方塊資料行是另一個範例,其中自動排序對於群組處於相同狀態的專案很有用。
不論設定為何,您都可以依任何資料行或多個資料行中的值, SortMode 以程式設計方式排序 DataGridView 。 當您想要提供自己的使用者介面 (UI) 進行排序,或當您想要實作自訂排序時,以程式設計方式排序會很有用。 例如,當您設定 DataGridView 選取模式以啟用資料行標頭選取時,提供您自己的排序 UI 會很有用。 在此情況下,雖然資料行標頭無法用於排序,但仍希望標頭顯示適當的排序圖像,因此您會將 屬性設定 SortMode 為 Programmatic 。
設定為程式設計排序模式的資料行不會自動顯示排序圖像。 針對這些資料行,您必須藉由設定 DataGridViewColumnHeaderCell.SortGlyphDirection 屬性來自行顯示圖像。 如果您想要自訂排序的彈性,這是必要的。 例如,如果您依多個資料行排序 DataGridView ,您可能會想要顯示多個排序圖像或沒有排序圖像。
雖然您可以透過程式設計方式依任何資料行排序 DataGridView ,但某些資料行,例如按鈕資料行,可能不會包含可有意義地排序的值。 針對這些資料行, SortMode 的 屬性設定 NotSortable 表示永遠不會用於排序,因此不需要為排序字元保留標頭中的空間。
DataGridView排序 時,您可以藉由檢查 和 屬性的值 SortedColumn 來判斷排序資料行和 SortOrder 排序次序。 這些值在自訂排序作業之後沒有意義。 如需自訂排序的詳細資訊,請參閱本主題稍後的自訂排序一節。
DataGridView排序包含系結和未系結資料行的控制項時,無法自動維護未系結資料行中的值。 若要維護這些值,您必須將 屬性設定 VirtualMode 為 true
並處理 CellValueNeeded 和 CellValuePushed 事件,以實作虛擬模式。 如需詳細資訊,請參閱 如何:在 Windows Forms DataGridView 控制項 中實作虛擬模式。 不支援以系結模式中的未系結資料行排序。
程式設計排序
您可以呼叫方法 Sort ,以程式設計方式排序 DataGridView 。
Sort(DataGridViewColumn,ListSortDirection)
方法的多 Sort 載會採用 DataGridViewColumn 和 ListSortDirection 列舉值做為參數。 當使用可有意義排序的值來排序資料行時,此多載很有用,但您不想要針對自動排序進行設定。 當您呼叫此多載並傳入 SortMode 具有 屬性值 DataGridViewColumnSortMode.Automatic 的資料行時, SortedColumn 會自動設定 和 SortOrder 屬性,且適當的排序字元會出現在資料行標頭中。
注意
DataGridView當控制項藉由設定 DataSource 屬性系結至外部資料源時, Sort(DataGridViewColumn,ListSortDirection)
方法多載不適用於未系結的資料行。 此外,當 屬性是 true
時 VirtualMode ,您只能針對系結資料行呼叫此多載。 若要判斷資料行是否系結資料,請檢查 IsDataBound 屬性值。 不支援在系結模式中排序未系結的資料行。
自訂排序
您可以使用 方法的多 Sort 載或處理 SortCompare 事件來自訂 DataGridViewSort(IComparer)
。
方法 Sort(IComparer)
多載會採用實作 介面做為參數的類別 IComparer 實例。 當您想要提供自訂排序時,此多載很有用;例如,當資料行中的值沒有自然排序次序或自然排序次序不適當時。 在此情況下,您無法使用自動排序,但您可能仍希望使用者按一下資料行標頭來排序。 如果您不使用資料行標頭進行選取, ColumnHeaderMouseClick 您可以在 事件的處理常式中呼叫此多載。
注意
只有在 Sort(IComparer)
控制項未系結至外部資料源且 VirtualMode 屬性值為 false
時, DataGridView 方法多載才有效。 若要自訂系結至外部資料源的資料行排序,您必須使用資料來源所提供的排序作業。 在虛擬模式中,您必須為未系結的資料行提供自己的排序作業。
若要使用 Sort(IComparer)
方法多載,您必須建立自己的類別來實作 IComparer 介面。 這個介面需要您的類別實 IComparer.Compare 作 方法,在 DataGridViewDataGridViewRow 呼叫 方法多載時 Sort(IComparer)
,傳遞 物件做為輸入。 如此一來,您可以根據任何資料行中的值來計算正確的資料列順序。
Sort(IComparer)
方法多載不會設定 SortedColumn 和 SortOrder 屬性,因此您必須一律設定 DataGridViewColumnHeaderCell.SortGlyphDirection 屬性以顯示排序字元。
作為方法多載的 Sort(IComparer)
替代方案,您可以實作 事件的處理常式 SortCompare 來提供自訂排序。 當使用者按一下設定為自動排序的資料行標頭,或呼叫 Sort(DataGridViewColumn,ListSortDirection)
方法的多 Sort 載時,就會發生此事件。 此事件會針對 控制項中的每個資料列組發生,讓您能夠計算其正確順序。
注意
當 SortCompare 屬性設定或屬性值為 true
時 DataSourceVirtualMode ,不會發生此事件。
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應