共用方式為


縮放 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 事件,為個別儲存格提供工具提示和捷徑功能表。

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

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

防止資料列成為未共用

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

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

另請參閱