我的代码如下:
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
是只读的。现在还有一个带有ProgressBar
样式的Marquee
,它向我展示了让我们说5000多行滚动冻结了Form
,但我猜它只是线程/背景工作等问题。
最让我害怕的是选择。拥有 8000行并点击最后一行(8000)需要4.2秒才能选择它。其内容如下:
4000行使其成为2.1秒等。如果选择第8000行,则最小化然后最大化需要4.2秒。选择第1行“让它”再次开心。这是不可接受的。 *为什么要为我的Form
“标记”第8000行这么难?
VirtualMode的分页效果很好,但选择很痛苦。
还有另一个问题/行为:
当我将鼠标移到行上时,为什么会出现CellValueNeeded
事件?他们已经画了?那为什么要浪费资源?
这个选择问题有什么解决方案吗?或者我必须限制数据网格中的最大记录
答案 0 :(得分:2)
您想要玩的一件事是细胞的自动调整,因为gridview必须遍历所有细胞才能找到长度最长的细胞。您应该禁用自动调整,您应该以编程方式执行此操作。 关于您的选择问题:选择导致大量重绘,我的预感是重绘所有单元格,因此滞后与行/单元格数成正比。
要使用虚拟模式,您需要的不仅仅是将VirtualMode设置为true。看看你的dataGridView1_RowsAdded,dataGridView1_CellValuePushed和dataGridView1_CellValidating方法会很有趣,因为它们可能是延迟的罪魁祸首。