为数据绑定的数据网格视图实现虚拟模式

时间:2012-10-24 13:08:31

标签: c# .net data-binding datagridview virtualmode

关于实施建议的一般性问题。

我有一个绑定到datagridview的集合。

BindingList<Line> allLines = new BindingList<Line>();
dataGridView1.DataSource = allLines;

我想实现virtual mode,因为该集合可能包含数百万个条目(Line个对象),所以我认为仅仅“缓存”或显示一些需要的条目可能会更快时间。我理解的虚拟模式是什么?

我看过:http://msdn.microsoft.com/en-us/library/2b177d6d.aspx

但我无法让datagridview成为databound

我无法指定行数:

this.dataGridView1.RowCount = 20;
`RowCount property cannot be set on a data-bound DataGridView control.`

编辑:此链接表明我可能必须完全删除绑定。是这样的吗? http://msdn.microsoft.com/en-us/library/ms171622.aspx

'如果绑定模式无法满足您的性能需求,您可以通过虚拟模式事件处理程序管理自定义缓存中的所有数据。'

1 个答案:

答案 0 :(得分:3)

如果您想使用DataGridView.VirtualMode,那么您不应该使用绑定数据集。他们是对立的。因此,您不需要设置DataSource,只需设置RowCount属性并为DataGridView.CellValueNeeded Event提供事件处理程序。

除了首先需要将dataGridView.VirtualMode属性设置为true之外,还可以写一下设计器。默认情况下,它设置为false,这就是您收到异常的原因,并说您无法设置RowCount

您可能需要手动初始化网格列。

在刷新网格时(例如,点击按钮时),您必须

dataGridView.RowCount = 0;
\\refresh your cache, where you store rows for the grid
\\...
dataGridView.RowCount = yourCache.Count;//or some other property, getting the number of cached rows.

将为每行的每列触发CellValueNeeded事件,具体取决于RowCount和列数。您需要根据e.Valuee.RowIndex在事件处理程序中设置e.ColumnIndex处理过的单元格的值。

因此,为此,您至少需要处理CellValueNeeded。如果您的DataGridView是只读的,则不需要其他事件。

Virtual Mode in the Windows Forms DataGridView Control提供了更完整,更连续的概述。