共用方式為


縮放 Windows Form DataGridView 控制項的最佳作法

更新:2007 年 11 月

DataGridView 控制項的設計是為了要提供最佳的延展性 (Scalability)。如果您需要顯示大量的資料,則應該遵循本主題中所提供的方針,以避免耗用大量的記憶體,或造成使用者介面 (UI) 的回應效能下滑。這個主題討論了下列問題:

  • 有效使用儲存格樣式

  • 有效使用快速鍵功能表

  • 有效使用自動調整大小

  • 有效使用選取的儲存格、資料列和資料行集合

  • 使用共用資料列

  • 避免資料列變成非共用

如果您有特殊的效能需求,則可以實作虛擬模式並提供您自己的資料管理作業。如需詳細資訊,請參閱 Windows Form DataGridView 控制項的資料顯示模式

有效使用儲存格樣式

每個儲存格、資料列和資料行都有自己的樣式資訊。樣式資訊儲存於 DataGridViewCellStyle 物件當中。為許多個別的 DataGridView 項目建立儲存格樣式物件可能會很沒有效率,尤其是當您要使用大量資料的時候。若要避免對效能產生影響,請使用以下的方針:

有效使用快速鍵功能表

每個儲存格、資料列和資料行都有自己的快速鍵功能表。DataGridView 控制項中的快速鍵功能表會以 ContextMenuStrip 控制項來表示。就如同儲存格樣式物件一般,為許多個別的 DataGridView 項目建立快速鍵功能表將會對效能造成負面影響。若要避免這種效能損失,請使用以下的方針:

  • 避免為個別儲存格和資料列建立快速鍵功能表。這包括了資料列範本,當新的資料列加入至控制項時,會將其快速鍵功能表一併複製。為了達到最佳的延展性,請只使用控制項的 ContextMenuStrip 屬性為整個控制項指定單一的快速鍵功能表。

  • 如果您必須為多個資料列或儲存格建立多個快速鍵功能表,請處理 CellContextMenuStripNeededRowContextMenuStripNeeded 事件。這些事件可以讓您自行管理快速鍵功能表物件,允許您調整效能。

有效使用自動調整大小

資料列、資料行和行首都可以在儲存格內容變更時自動調整大小,以顯示儲存格的完整內容而不致於發生裁剪。變更調整大小模式同樣可以調整資料列、資料行和行首的大小。為了判斷正確的大小,DataGridView 控制項必須檢查其必須容納的每個儲存格的值。當處理大量資料集時,如果發生自動調整大小,則這項分析可能會對控制項的效能造成負面影響。若要避免效能損失,請使用以下的方針:

如需詳細資訊,請參閱 Windows Form DataGridView 控制項中的調整大小選項

有效使用選取的儲存格、資料列和資料行集合

當選取範圍比較大時,SelectedCells 集合並無法有效率地執行。SelectedRowsSelectedColumns 集合也可能會變得沒有效率,但是情況會稍微緩和一點,因為在典型的 DataGridView 控制項中,資料列要比儲存格少得多,而資料行又比資料列來得更少。若要避免使用這些集合時的效能損失,請使用以下方針:

使用共用資料列

DataGridView 控制項中共用資料列可以達到記憶體的有效使用。透過共用 DataGridViewRow 類別的執行個體,資料列會盡可能共用其外觀和行為的資訊。

雖然共用資料列的執行個體可以節省記憶體,但是資料列很容易就會變成非共用的。例如,每當使用者直接與一個儲存格互動時,該資料列就會變成非共用的。因為這種情況無法避免,本主題的方針只有在您必須使用大量資料,而且每次程式執行時,使用者只會與相對少數的資料互動的情況下,才會顯得有用。

在未繫結的 DataGridView 控制項中,如果資料列的任何一個儲存格包含值,該資料列就非共用的。當 DataGridView 控制項繫結至一個外部資料來源,或當您實作了虛擬模式並提供自己的資料來源時,儲存格的值會儲存在控制項之外,而不是在儲存格物件中,因此資料列就可以共用。

如果資料列物件其全部儲存格的狀態都可以從資料列狀態和包含儲存格的資料行狀態來判斷時,才可以將這個物件共用。如果您變更了一個儲存格的狀態,使它無法再從資料列或資料行的狀態推算,該資料列就會變成非共用的。

例如,在下列任何一種情況下均無法共用資料列:

  • 資料列中包含了一個單一選取的儲存格,而且不屬於已選取的資料行。

  • 資料列中包含了一個儲存格,它的 ToolTipTextContextMenuStrip 屬性已經被設定。

  • 資料列中包含了一個 DataGridViewComboBoxCell,它的 Items 屬性已經被設定。

在繫結模式或虛擬模式中,您可以藉由處理 CellToolTipTextNeededCellContextMenuStripNeeded 事件,為個別的儲存格提供工具提示和快速鍵功能表。

每當有資料列加入至 DataGridViewRowCollection 時,DataGridView 控制項將自動嘗試共用資料列。請使用以下方針來確保資料列會共用:

若要判斷資料列是否已共用,可使用 DataGridViewRowCollection.SharedRow 方法來擷取資料列物件,然後檢查物件的 Index 屬性。共用的資料列其 Index 屬性值永遠為 –1。

避免資料列變成非共用

由於程式碼或使用者的操作,共用的資料列可能會變成非共用的。若要避免對效能產生影響,您應該避免讓資料列變成非共用的。在應用程式開發期間,您可以處理 RowUnshared 事件來判斷資料列何時變成非共用的。這種做法在偵錯資料列共用問題時相當有用。

若要避免資料列變成非共用的,請使用以下的方針:

請參閱

工作

HOW TO:設定 Windows Form DataGridView 控制項的預設儲存格樣式

概念

Windows Form DataGridView 控制項中的虛擬模式

Windows Form DataGridView 控制項的資料顯示模式

Windows Form DataGridView 控制項中的儲存格樣式

Windows Form DataGridView 控制項中的調整大小選項

參考

DataGridView

其他資源

Windows Form DataGridView 控制項中的效能微調