共用方式為


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

透過虛擬模式,您可以管理 DataGridView 控制項與自訂資料快取之間的互動。 若要實作虛擬模式,請將 VirtualMode 屬性設定為 true,並處理本主題中所述的一或多個事件。 您通常會至少處理 CellValueNeeded 事件,這可讓控制項查閱資料快取中的值。

繫結模式和虛擬模式

只有在您需要補充或取代繫結模式時,才需要虛擬模式。 在繫結模式中,您可以設定 DataSource 屬性,而控制項會自動從指定的來源載入資料,並將使用者變更送回給它。 您可以控制要顯示哪些繫結資料行,而且資料來源本身通常會處理排序之類的作業。

補充繫結模式

您可以藉由顯示未繫結的資料行以及繫結的資料行來補充繫結模式。 這有時稱為「混合模式」,可用於顯示計算值或使用者介面 (UI) 控制項等項目。

由於未繫結的資料行位於資料來源之外,因此資料來源的排序作業會忽略這些資料行。 因此,當您在混合模式中啟用排序時,您必須管理本機快取中的未繫結資料,並實作虛擬模式,讓 DataGridView 控制項與其互動。

如需關於使用虛擬模式維護未繫結資料行中值的詳細資訊,請參閱 DataGridViewCheckBoxColumn.ThreeState 屬性和 System.Windows.Forms.DataGridViewComboBoxColumn 類別參考主題中的範例。

取代繫結模式

如果繫結模式不符合您的效能需求,您可以透過虛擬模式事件處理常式來管理自訂快取中的所有資料。 例如,您可以使用虛擬模式來實作 Just-In-Time 資料載入機制,只擷取來自網路資料庫的必要資料,以獲得最佳效能。 當透過緩慢的網路連線或具有有限 RAM 或儲存空間的用戶端電腦處理大量資料時,此案例特別有用。

如需在 Just-In-Time 案例中使用虛擬模式的詳細資訊,請參閱 在 Windows Forms DataGridView 控制項中使用 Just-In-Time 資料載入實作虛擬模式

虛擬模式事件

如果您的資料是唯讀的,則 CellValueNeeded 事件可能會是您需要處理的唯一事件。 其他虛擬模式事件可讓您啟用特定功能,例如使用者編輯、資料列新增和刪除,以及資料列層級交易。

有些標準 DataGridView 事件 (例如使用者新增或刪除資料列時所發生的事件,或是編輯、剖析、驗證或格式化儲存格值時) 也適用於虛擬模式。 您也可以處理事件,讓您維護通常不儲存在繫結資料來源中的值,例如儲存格 ToolTip 文字、儲存格和資料列錯誤文字、儲存格和資料列捷徑功能表資料,以及資料列高度資料。

如需實作虛擬模式以管理具有資料列層級認可範圍之讀取/寫入資料的詳細資訊,請參閱 逐步解說:在 Windows Forms DataGridView 控制項中實作虛擬模式

如需使用儲存格層級認可範圍實作虛擬模式的範例,請參閱 VirtualMode 屬性參考主題。

只有當 VirtualMode 屬性設定為 true 時,才會發生下列事件。

活動 描述
CellValueNeeded 由控制項用來從資料快取擷取儲存格值以供顯示。 這個事件只會針對未繫結資料行中的儲存格發生。
CellValuePushed 由控制項用來將儲存格的使用者輸入提交至資料快取。 這個事件只會針對未繫結資料行中的儲存格發生。

變更 CellValuePushed 事件處理常式以外的快取值時,呼叫 UpdateCellValue 方法以確保目前的值會顯示在控制項中,並套用目前生效的任何自動重設大小模式。
NewRowNeeded 由控制項用來指出資料快取中需要新的資料列。
RowDirtyStateNeeded 由控制項用來判斷資料列是否有任何未認可的變更。
CancelRowEdit 由控制項用來指出資料列應該還原為其快取值。

下列事件在虛擬模式中很有用,但不論 VirtualMode 屬性設定為何,都可以使用。

事件 描述
UserDeletingRow

UserDeletedRow

RowsRemoved

RowsAdded
由控制項用來指出何時刪除或新增資料列,讓您據以更新資料快取。
CellFormatting

CellParsing

CellValidating

CellValidated

RowValidating

RowValidated
由控制項用來將要顯示的儲存格值格式化,以及剖析和驗證使用者輸入。
CellToolTipTextNeeded 當已設定 DataSource 屬性或 VirtualMode 屬性為 true時,由控制項用來擷取儲存格 ToolTip 文字。

只有當 ShowCellToolTips 屬性值為 true 時,才會顯示儲存格 ToolTip 提示。
CellErrorTextNeeded

RowErrorTextNeeded
當已設定 DataSource 屬性或 VirtualMode 屬性為 true時,由控制項用來擷取儲存格或資料列錯誤文字。

當您變更儲存格或資料列錯誤文字時,請呼叫 UpdateCellErrorText 方法或 UpdateRowErrorText 方法,以確保控制項中會顯示目前的值。

ShowCellErrorsShowRowErrors 屬性值為 true時,會顯示儲存格和資料列錯誤字元。
CellContextMenuStripNeeded

RowContextMenuStripNeeded
當已設定控制項 DataSource 屬性或 VirtualMode 屬性為 true 時,由控制項用來擷取儲存格或資料列 ContextMenuStrip
RowHeightInfoNeeded

RowHeightInfoPushed
由控制項用來擷取或儲存資料快取中的資料列高度資訊。 變更 RowHeightInfoPushed 事件處理常式以外的快取資料列高度資訊時,呼叫 UpdateRowHeightInfo 方法,以確保控制項的顯示中使用目前的值。

虛擬模式中的最佳做法

如果您要實作虛擬模式,以便有效率地處理大量資料,您也會想要確保能有效率地使用 DataGridView 控制項本身。 如需有效使用儲存格樣式、自動重設大小、選取範圍和資料列共用的詳細資訊,請參閱 調整 Windows Forms DataGridView 控制項的最佳做法

另請參閱