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

Jim*_*mmy 4 .net c# data-binding datagridview virtualmode

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

我有一个绑定到datagridview.

BindingList<Line> allLines = new BindingList<Line>();
dataGridView1.DataSource = allLines;
Run Code Online (Sandbox Code Playgroud)

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

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

但我无法让它为datagridviewthat is 工作databound

我无法指定行数:

this.dataGridView1.RowCount = 20;
`RowCount property cannot be set on a data-bound DataGridView control.`
Run Code Online (Sandbox Code Playgroud)

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

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

hor*_*rgh 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.
Run Code Online (Sandbox Code Playgroud)

CellValueNeeded事件将为每一行的每一列触发,具体取决于 RowCount 和列数。您应该e.Value根据e.RowIndex和 使用事件处理程序中已处理单元格的值进行设置e.ColumnIndex

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

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