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

控制項 DataGridView 的設計目的是提供最大的延展性。 如果您需要顯示大量資料,您應該遵循本主題中所述的指導方針,以避免耗用大量的記憶體或降低使用者介面 (UI) 的回應性。 本主題討論下列問題:

  • 有效率地使用儲存格樣式

  • 有效率地使用快顯功能表

  • 有效率地使用自動調整大小

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

  • 使用共用資料列

  • 防止資料列未共用

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

有效率地使用儲存格樣式

每個儲存格、資料列和資料行都可以有自己的樣式資訊。 樣式資訊會儲存在 物件中 DataGridViewCellStyle 。 為許多個別 DataGridView 元素建立資料格樣式物件可能會沒有效率,尤其是在處理大量資料時。 若要避免效能影響,請使用下列指導方針:

有效率地使用快顯功能表

每個儲存格、資料列和資料行都可以有自己的快捷方式功能表。 控制項中的 DataGridView 快顯功能表是由 ContextMenuStrip 控制項表示。 就像儲存格樣式物件一樣,為許多個別 DataGridView 元素建立快顯功能表會對效能造成負面影響。 若要避免此懲罰,請使用下列指導方針:

  • 避免為個別儲存格和資料列建立快顯功能表。 這包括資料列範本,當新的資料列新增至 控制項時,會連同其快捷方式功能表一起複製。 若要達到最大延展性,請只使用控制項的 ContextMenuStrip 屬性來指定整個控制項的單一快捷方式功能表。

  • 如果您需要多個資料列或儲存格的多個快顯功能表,請處理 CellContextMenuStripNeededRowContextMenuStripNeeded 事件。 這些事件可讓您自行管理快捷方式功能表物件,讓您微調效能。

有效率地使用自動調整大小

資料列、資料行和標頭可以隨著儲存格內容變更而自動調整大小,讓儲存格的整個內容顯示而不裁剪。 變更調整大小模式也可以調整資料列、資料行和標頭的大小。 若要判斷正確的大小, DataGridView 控制項必須檢查它必須容納的每個儲存格值。 使用大型資料集時,此分析可能會對自動調整大小時控制項的效能產生負面影響。 若要避免效能降低,請使用下列指導方針:

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

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

集合 SelectedCells 不會透過大型選取專案有效率地執行。 SelectedRowsSelectedColumns 集合也可能效率低下,不過,雖然在較小的程度下,因為資料列比一般 DataGridView 控制項中的資料格少很多,而且資料行比資料列少很多。 若要避免使用這些集合時的效能降低,請使用下列指導方針:

使用共用資料列

透過共用資料列在 DataGridView 控制項中實現有效率的記憶體使用。 資料列會藉由共用 類別的 DataGridViewRow 實例,盡可能共用其外觀和行為的相關資訊。

共用資料列實例可節省記憶體時,資料列可以輕鬆地取消共用。 例如,每當使用者直接與儲存格互動時,其資料列就會變成未共用。 由於無法避免,本主題中的指導方針只有在使用非常大量的資料時才有用,而且只有在每次執行程式時,使用者才會與相對較小的資料互動時使用。

如果其中任何儲存格包含值,就無法在未系結 DataGridView 的控制項中共用資料列。 DataGridView當控制項系結至外部資料源或實作虛擬模式並提供自己的資料來源時,資料格值會儲存在控制項外部,而不是儲存在儲存格物件中,讓資料列可供共用。

只有當所有資料格的狀態都可以從資料列的狀態和包含儲存格的資料行狀態判斷時,才能共用資料列物件。 如果您變更儲存格的狀態,使其無法再從其資料列和資料行的狀態推斷出來,則無法共用資料列。

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

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

DataGridView每當資料列加入 至 DataGridViewRowCollection 時,控制項就會自動嘗試使用共用資料列。 使用下列指導方針確保共用資料列:

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

防止資料列變成未共用

共用的資料列可能會因為程式碼或使用者動作而取消共用。 若要避免效能影響,您應該避免造成資料列取消共用。 在應用程式開發期間,您可以處理 RowUnshared 事件,以判斷資料列何時取消共用。 偵錯資料列共用問題時,這非常有用。

若要防止資料列不共用,請使用下列指導方針:

另請參閱