共用方式為


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

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

DataGridViewColumnSortMode 說明
Automatic 文字輸入框資料行的預設值。 除非使用資料行標頭進行選取,否則按下資料行標頭會自動依這個資料行排序 DataGridView,並顯示表示排序順序的字符。
NotSortable 非文字輸入框資料行的預設值。 您可以透過程式設計方式排序此資;不過,其不適用於排序,因此不會保留任何空間給排序字符。
Programmatic 您可以透過程式設計方式排序此資料行,並將空間保留給排序字符。

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

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

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

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

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

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

程式設計排序

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

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

備註

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

自訂排序

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

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

備註

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

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

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

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

備註

當設定 DataSource 屬性或當 VirtualMode 屬性值為 true 時,不會發生 SortCompare 事件。

另請參閱