缩放 Windows 窗体 DataGridView 控件的最佳做法

更新:2007 年 11 月

DataGridView 控件的设计目的是提供最大的伸缩性。如果需要显示大量数据,请遵循本主题中所描述的准则,以避免耗费大量内存或降低用户界面(UI)的响应能力。本主题讨论下列问题:

  • 有效使用单元格样式

  • 有效使用快捷菜单

  • 有效使用自动大小调整

  • 有效使用选定单元格、行和列的集合

  • 使用共享行

  • 防止行成为非共享行

如果有特殊的性能需求,您可以实现虚拟模式并提供自己的数据管理操作。有关更多信息,请参见 Windows 窗体 DataGridView 控件中的数据显示模式

有效使用单元格样式

每一个单元格、行和列都有其自己的样式信息。样式信息存储在 DataGridViewCellStyle 对象中。为许多单个 DataGridView 元素创建单元格样式对象是低效的,特别是处理大量数据时。为避免对性能的影响,请遵循以下准则:

有效使用快捷菜单

每一个单元格、行和列都有其自己的快捷菜单。DataGridView 控件中的快捷菜单由 ContextMenuStrip 控件表示。正如单元格样式对象一样,逐个地为众多 DataGridView 元素创建快捷菜单将会给性能带来负面影响。为了避免这种性能影响,请遵循以下准则:

  • 避免为单个单元格和行创建快捷菜单。这包括行模板,向控件添加新行时行模板与其快捷菜单一起被复制。为了获得最大的伸缩性,仅使用控件的 ContextMenuStrip 属性为整个控件指定同一个快捷菜单。

  • 如果有多个行或单元格需要多个快捷菜单,可处理 CellContextMenuStripNeededRowContextMenuStripNeeded 事件。这些事件使您可以自己管理快捷菜单对象,从而允许您对性能进行调整。

有效使用自动大小调整

如果单元格内容发生更改,行、列和标题可以自动调整大小,以使单元格的整个内容能够完整地显示。更改调整大小模式也可以调整行、列和标题的大小。为了确定正确的大小,DataGridView 控件必须检查每一个单元格所容纳的值。当处理大数据集时,如果发生自动大小调整,这种分析可使控件的性能下降。为了避免性能下降,请遵循以下准则:

有关更多信息,请参见 Windows 窗体 DataGridView 控件中的大小调整选项

有效使用选定单元格、行和列的集合

SelectedCells 集合的执行对于大型选择是低效的。使用 SelectedRowsSelectedColumns 集合执行效率也不高,但是程度要轻一些,因为在一个典型的 DataGridView 控件中行远远少于单元格,列远远少于行。为了避免由于使用以上集合而造成性能下降,请遵循以下准则:

使用共享行

DataGridView 控件中可通过共享行实现内存的高效使用。通过共享 DataGridViewRow 类的实例,行将共享尽可能多的有关自身外观和行为的信息。

虽然共享行实例节省内存,但是行很容易成为非共享行。例如,每当用户直接同单元格进行交互时,单元格的行成为非共享行。由于这是不能避免的,所以仅当处理大量数据,以及仅当用户在运行您的程序时与相对少的部分数据进行交互的情况下,本主题中的准则才是有用的。

如果行中的任意单元格包含值,在未绑定的 DataGridView 控件中不能共享行。当 DataGridView 控件绑定到外部数据源或当您实现虚拟模式并且提供自己的数据源时,单元格的值被存储在控件外而不是单元格对象中,因而允许行共享。

仅当行中所有单元格的状态可以由包含这些单元格的行状态和列状态确定时,行对象才能共享。如果您更改单元格状态以使其不再派生自所处行和列的状态,则不能共享行。

例如,在下列任何情况均不能共享行:

在绑定模式或虚拟模式中,您可以通过处理 CellToolTipTextNeededCellContextMenuStripNeeded 事件为每个单元格提供 工具提示和快捷菜单。

每当向 DataGridViewRowCollection 添加行时,DataGridView 控件将自动尝试使用共享行。为确保行被共享,请遵循以下准则:

若要确定行是否共享,请使用 DataGridViewRowCollection.SharedRow 方法检索行对象,然后检查该对象的 Index 属性。共享行的 Index 属性值始终为 –1。

防止行成为非共享行

共享行可以由于程序代码或用户操作而成为非共享行。为了避免对性能的影响,您应该避免使行成为非共享行。在应用程序开发过程中,可以处理 RowUnshared 事件来确定行何时成为非共享行。这在调试行共享问题时十分有用。

若要防止行成为非共享行,请遵循以下准则:

请参见

任务

如何:设置 Windows 窗体 DataGridView 控件的默认单元格样式

概念

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

Windows 窗体 DataGridView 控件中的数据显示模式

Windows 窗体 DataGridView 控件中的单元格样式

Windows 窗体 DataGridView 控件中的大小调整选项

参考

DataGridView

其他资源

Windows 窗体 DataGridView 控件中的性能优化