Windows 窗体 DataGridView 控件中的虚拟模式

使用虚拟模式,可以管理 DataGridView 控件与自定义数据缓存之间的交互。 若要实现虚拟模式,请将 VirtualMode 属性设置为 true 并处理本主题中所述的一个或多个事件。 通常至少将处理 CellValueNeeded 事件,这样控件就可以在数据缓存中查找值。

绑定模式和虚拟模式

仅当需要补充或替换绑定模式时,才需要虚拟模式。 在绑定模式下,设置 DataSource 属性,控件会自动从指定的源加载数据,并将用户更改提交回该源。 可以控制显示哪些绑定列,数据源本身通常处理排序等操作。

补充绑定模式

可以通过同时显示未绑定列和绑定列来补充绑定模式。 这有时称为“混合模式”,可用于显示计算值或用户界面(UI)控件等内容。

由于未绑定列不在数据源之外,因此数据源的排序操作会忽略它们。 因此,在混合模式下启用排序时,必须在本地缓存中管理未绑定的数据并实现虚拟模式,以便 DataGridView 控件与其交互。

有关使用虚拟模式维护未绑定列中的值的详细信息,请参阅 DataGridViewCheckBoxColumn.ThreeState 属性和 System.Windows.Forms.DataGridViewComboBoxColumn 类参考主题中的示例。

替换绑定模式

如果绑定模式不符合性能需求,可以通过虚拟模式事件处理程序管理自定义缓存中的所有数据。 例如,可以使用虚拟模式来实现“按需加载”数据机制,该机制仅在需要时从网络数据库中提取必要的数据量以实现最佳性能。 当通过速度慢的网络连接,或者在 RAM 和存储空间有限的客户端计算机上处理大量数据时,该方案尤其有用。

若要详细了解如何在实时场景中使用虚拟模式,请参阅在 Windows 窗体 DataGridView 控件中实现实时数据加载的虚拟模式

虚拟模式事件

如果数据是只读的,则 CellValueNeeded 事件可能是需要处理的唯一事件。 通过其他虚拟模式事件,可以启用特定功能,例如用户编辑、行添加和删除以及行级事务。

某些标准 DataGridView 事件(例如,当用户添加或删除行时或编辑、分析、验证或格式化单元格值时发生的事件)在虚拟模式下也很有用。 你还可以处理可用于维护通常未存储在绑定数据源中的值的事件,例如单元格工具提示文本、单元格和行错误文本、单元格和行快捷菜单数据、行高数据。

若要详细了解如何实现虚拟模式在行级提交范围内管理读/写数据,请参阅演练:在 Windows 窗体 DataGridView 控件中实现虚拟模式

有关在单元格级提交范围实现虚拟模式的示例,请参阅 VirtualMode 属性参考主题。

仅当 VirtualMode 属性设置为 true时,才会发生以下事件。

事件 / 活动 DESCRIPTION
CellValueNeeded 由控件用来从数据缓存中检索单元格值以供显示。 此事件仅适用于未绑定列中的单元格。
CellValuePushed 控件使用此事件将单元格的用户输入提交到数据缓存。 此事件仅适用于未绑定列中的单元格。

UpdateCellValue 事件处理程序之外更改缓存值时调用 CellValuePushed 方法,以确保当前值显示在控件中,并应用当前生效的任何自动大小调整模式。
NewRowNeeded 控件使用此事件来指示数据缓存中需要新行。
RowDirtyStateNeeded 控件使用此事件来确定某一行是否有任何未提交的更改。
CancelRowEdit 控件使用此事件来指示行应还原为其缓存的值。

以下事件在虚拟模式下非常有用,但无论 VirtualMode 属性设置如何,都可以使用。

事件 DESCRIPTION
UserDeletingRow

UserDeletedRow

RowsRemoved

RowsAdded
控件用于指示何时删除或添加行,以便相应地更新数据缓存。
CellFormatting

CellParsing

CellValidating

CellValidated

RowValidating

RowValidated
由控件用于格式化单元格值以便显示,并解析和验证用户输入。
CellToolTipTextNeeded 当设置了 DataSource 属性或 VirtualMode 属性为 true 时,控件使用此事件来检索单元格工具提示文本。

只有 ShowCellToolTips 属性值为 true 时,才显示单元格工具提示。
CellErrorTextNeeded

RowErrorTextNeeded
当设置了 DataSource 属性或 VirtualMode 属性为 true 时,控件使用此事件来检索单元格或行错误。

更改单元格或行错误文本时调用 UpdateCellErrorText 方法或 UpdateRowErrorText 方法,以确保当前值显示在控件中。

ShowCellErrorsShowRowErrors 属性值为 true 时,将显示单元格和行错误字形。
CellContextMenuStripNeeded

RowContextMenuStripNeeded
当设置了控件 ContextMenuStrip 属性或 DataSource 属性为 VirtualMode 时,控件使用此事件来检索单元格或行 true
RowHeightInfoNeeded

RowHeightInfoPushed
由控件用来检索或存储数据缓存中的行高度信息。 在 UpdateRowHeightInfo 事件处理程序之外更改缓存行高度信息时调用 RowHeightInfoPushed 方法,以确保在控件的显示中使用当前值。

虚拟模式下的最佳做法

如果您是为了高效处理海量数据而实现虚拟模式,还需要确保您同样高效地处理 DataGridView 控件本身。 关于有效使用单元格样式、自动大小调整、选择和行共享的详细信息,请参阅缩放 Windows 窗体 DataGridView 控件的最佳做法

另请参阅