DataGridView, Virtual Mode and "lags"
本文关键字:quot lags and Virtual Mode DataGridView | 更新日期: 2023-09-27 18:15:44
我的代码如下:
private void dataGridView4_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
Records recordsTmp = null;
recordsTmp = (Records)this.ArrayOfRecords[e.RowIndex]; //ArrayList with string[] objects inside
switch (dataGridView4.Columns[e.ColumnIndex].HeaderText)
{
case "#":
e.Value = recordsTmp.nr;
break;
case "ip":
e.Value = recordsTmp.Ip;
break;
case "long":
e.Value = recordsTmp.Long;
break;
case "3":
e.Value = recordsTmp.type;
break;
case "4":
e.Value = recordsTmp.time;
break;
}
-
ArrayOfRecords
每秒更新10-100个新的string[]
对象。 -
VirtualMode
设置为true -
SelectionMode
设置为FullRowSelect
。 -
dataGridView
is Read-only.
现在还有一个ProgressBar
与Marquee
风格的显示,让我们说5000+行滚动冻结Form
,但我猜这只是一个问题线程/后台工作器等。
最让我害怕的是选择。有8000行并单击最后一行(8000)需要4.2秒来选择它。内容如下:
4000行则为2.1秒,以此类推。如果选择第8000行,最小化和最大化将花费4.2秒。选择第一行"使它"再次快乐。它的不可接受的。*为什么我的Form
很难"标记"第8000行?
VirtualMode的分页工作完美,但选择是一个痛苦。
还有另一个问题/行为:
为什么当我将鼠标移动到行上时CellValueNeeded
事件会引发?已经刷好了吗?那么为什么会浪费资源呢?
这个选择问题有什么解决方案吗?或者我必须限制数据网格中的最大记录
您想要使用的一件事是单元格的自动大小,因为gridview必须遍历所有单元格以找到长度最长的单元格。您应该禁用自动调整大小,并且应该通过编程来实现。关于你的选择问题:选择导致很多重绘,我的直觉是,它重绘了你所有的单元格,因此延迟与你的行/单元格计数成正比。
为了使用VirtualMode,你需要的不仅仅是将VirtualMode设置为true。这将是有趣的看到您的dataGridView1_RowsAdded, datagridview1_cellvaluepush和datagridview1_cellvalididating方法,因为它们可能是延迟的罪魁祸首。