关于实施建议的一般性问题。
我有一个绑定到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
'如果绑定模式无法满足您的性能需求,您可以通过虚拟模式事件处理程序管理自定义缓存中的所有数据。'
答案 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.Value
和e.RowIndex
在事件处理程序中设置e.ColumnIndex
处理过的单元格的值。
因此,为此,您至少需要处理CellValueNeeded
。如果您的DataGridView是只读的,则不需要其他事件。
Virtual Mode in the Windows Forms DataGridView Control提供了更完整,更连续的概述。