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 时,才会发生以下事件。

事件 说明
CellValueNeeded 控件使用此事件来检索数据缓存中的单元格值以将其显示。 只有未绑定列中的单元格才会此发生事件。
CellValuePushed 控件使用此事件将单元格的用户输入提交到数据缓存。 只有未绑定列中的单元格才会此发生事件。

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

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

事件 说明
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
当设置了控件 DataSource 属性或 VirtualMode 属性为 true 时,控件使用此事件来检索单元格或行 ContextMenuStrip
RowHeightInfoNeeded

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

虚拟模式的最佳做法

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

另请参阅