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

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 事件以确定行何时变成非共享行。 这在调试行共享问题时很有用。

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

另请参阅