Windows Form DataGridView 控制項中的資料行排序模式

DataGridView 資料行有三種排序模式。 每個資料行的排序模式都是透過 SortMode 資料行的 屬性來指定,其可設定為下列 DataGridViewColumnSortMode 其中一個列舉值。

DataGridViewColumnSortMode 描述
Automatic 文字方塊資料行的預設值。 除非使用資料行標頭進行選取,否則按一下資料行標頭會自動依這個資料行排序 DataGridView ,並顯示表示排序次序的字元。
NotSortable 非文字方塊資料行的預設值。 您可以以程式設計方式排序此資料行;不過,它不適用於排序,因此不會保留任何空間給排序圖像。
Programmatic 您可以以程式設計方式排序此資料行,並將空間保留給排序字元。

如果資料行包含可有意義排序的值,您可能會想要變更預設 NotSortable 為 的排序模式。 例如,如果您的資料庫資料行包含代表專案狀態的數位,您可以將影像資料行系結至資料庫資料行,將這些數字顯示為對應的圖示。 然後,您可以將數值資料格值變更為 事件處理常式 DataGridView.CellFormatting 中的影像顯示值。 在此情況下,將 屬性設定為 SortModeAutomatic 可讓使用者排序資料行。 自動排序可讓使用者將具有相同狀態的專案分組,即使對應至數位的狀態沒有自然序列也一樣。 核取方塊資料行是另一個範例,其中自動排序對於群組處於相同狀態的專案很有用。

不論設定為何,您都可以依任何資料行或多個資料行中的值, SortMode 以程式設計方式排序 DataGridView 。 當您想要提供自己的使用者介面 (UI) 進行排序,或當您想要實作自訂排序時,以程式設計方式排序會很有用。 例如,當您設定 DataGridView 選取模式以啟用資料行標頭選取時,提供您自己的排序 UI 會很有用。 在此情況下,雖然資料行標頭無法用於排序,但仍希望標頭顯示適當的排序圖像,因此您會將 屬性設定 SortModeProgrammatic

設定為程式設計排序模式的資料行不會自動顯示排序圖像。 針對這些資料行,您必須藉由設定 DataGridViewColumnHeaderCell.SortGlyphDirection 屬性來自行顯示圖像。 如果您想要自訂排序的彈性,這是必要的。 例如,如果您依多個資料行排序 DataGridView ,您可能會想要顯示多個排序圖像或沒有排序圖像。

雖然您可以透過程式設計方式依任何資料行排序 DataGridView ,但某些資料行,例如按鈕資料行,可能不會包含可有意義地排序的值。 針對這些資料行, SortMode 的 屬性設定 NotSortable 表示永遠不會用於排序,因此不需要為排序字元保留標頭中的空間。

DataGridView排序 時,您可以藉由檢查 和 屬性的值 SortedColumn 來判斷排序資料行和 SortOrder 排序次序。 這些值在自訂排序作業之後沒有意義。 如需自訂排序的詳細資訊,請參閱本主題稍後的自訂排序一節。

DataGridView排序包含系結和未系結資料行的控制項時,無法自動維護未系結資料行中的值。 若要維護這些值,您必須將 屬性設定 VirtualModetrue 並處理 CellValueNeededCellValuePushed 事件,以實作虛擬模式。 如需詳細資訊,請參閱 如何:在 Windows Forms DataGridView 控制項 中實作虛擬模式。 不支援以系結模式中的未系結資料行排序。

程式設計排序

您可以呼叫方法 Sort ,以程式設計方式排序 DataGridView

Sort(DataGridViewColumn,ListSortDirection)方法的多 Sort 載會採用 DataGridViewColumnListSortDirection 列舉值做為參數。 當使用可有意義排序的值來排序資料行時,此多載很有用,但您不想要針對自動排序進行設定。 當您呼叫此多載並傳入 SortMode 具有 屬性值 DataGridViewColumnSortMode.Automatic 的資料行時, SortedColumn 會自動設定 和 SortOrder 屬性,且適當的排序字元會出現在資料行標頭中。

注意

DataGridView當控制項藉由設定 DataSource 屬性系結至外部資料源時, Sort(DataGridViewColumn,ListSortDirection) 方法多載不適用於未系結的資料行。 此外,當 屬性是 trueVirtualMode ,您只能針對系結資料行呼叫此多載。 若要判斷資料行是否系結資料,請檢查 IsDataBound 屬性值。 不支援在系結模式中排序未系結的資料行。

自訂排序

您可以使用 方法的多 Sort 載或處理 SortCompare 事件來自訂 DataGridViewSort(IComparer)

方法 Sort(IComparer) 多載會採用實作 介面做為參數的類別 IComparer 實例。 當您想要提供自訂排序時,此多載很有用;例如,當資料行中的值沒有自然排序次序或自然排序次序不適當時。 在此情況下,您無法使用自動排序,但您可能仍希望使用者按一下資料行標頭來排序。 如果您不使用資料行標頭進行選取, ColumnHeaderMouseClick 您可以在 事件的處理常式中呼叫此多載。

注意

只有在 Sort(IComparer) 控制項未系結至外部資料源且 VirtualMode 屬性值為 false 時, DataGridView 方法多載才有效。 若要自訂系結至外部資料源的資料行排序,您必須使用資料來源所提供的排序作業。 在虛擬模式中,您必須為未系結的資料行提供自己的排序作業。

若要使用 Sort(IComparer) 方法多載,您必須建立自己的類別來實作 IComparer 介面。 這個介面需要您的類別實 IComparer.Compare 作 方法,在 DataGridViewDataGridViewRow 呼叫 方法多載時 Sort(IComparer) ,傳遞 物件做為輸入。 如此一來,您可以根據任何資料行中的值來計算正確的資料列順序。

Sort(IComparer)方法多載不會設定 SortedColumnSortOrder 屬性,因此您必須一律設定 DataGridViewColumnHeaderCell.SortGlyphDirection 屬性以顯示排序字元。

作為方法多載的 Sort(IComparer) 替代方案,您可以實作 事件的處理常式 SortCompare 來提供自訂排序。 當使用者按一下設定為自動排序的資料行標頭,或呼叫 Sort(DataGridViewColumn,ListSortDirection) 方法的多 Sort 載時,就會發生此事件。 此事件會針對 控制項中的每個資料列組發生,讓您能夠計算其正確順序。

注意

SortCompare 屬性設定或屬性值為 trueDataSourceVirtualMode ,不會發生此事件。

另請參閱