4

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

我有一个绑定到datagridview.

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

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

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

但我无法让它为 a datagridviewthat is工作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

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

4

1 回答 1

8

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

除了你需要先设置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.Value在事件处理程序中设置已处理单元格的值,具体取决于e.RowIndexe.ColumnIndex

因此,要使其正常工作,您至少需要处理CellValueNeeded. 如果您的 DataGridView 是只读的,则不需要其他事件。

Windows 窗体 DataGridView 控件中的虚拟模式提供了更完整和连续的概述。

于 2012-10-24T13:32:04.067 回答