为绑定数据的DataGridView实现虚拟模式

5

请问如何实现以下问题。

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

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

我想实现“虚拟模式”,因为集合可能包含数百万个条目(“Line”对象),所以我认为只“缓存”或显示一次需要的几个条目可能更快。这就是我理解的虚拟模式的作用?
我看了一下:http://msdn.microsoft.com/en-us/library/2b177d6d.aspx,但我无法使它适用于“数据绑定”的datagridview
我无法指定行数:
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个回答

8
如果您想使用 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.RowIndexe.ColumnIndex在事件处理程序中设置e.Value的值,以处理单元格的值。
因此,为了使其正常工作,您至少需要处理CellValueNeeded事件。如果您的DataGridView是只读的,则其他事件不是必需的。
有关更完整、连续的概述,请参见Windows窗体DataGridView控件中的虚拟模式

啊好的,谢谢你的回复。我还以为它们会互相补充呢。但是那个异常已经很明显了,虚拟模式已经被设置为 true 了。 - Jimmy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接