DataGridView、虚拟模式和“lags”

3

我的代码如下:

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秒。选择第一行可以“使其”恢复正常。这是无法接受的。*为什么对于我的Form来说标记第8000行如此困难呢?

VirtualMode的分页功能完美地工作,但选择却是一个痛点。

还有另一个问题/行为:

为什么我鼠标移动到行上时,CellValueNeeded事件会被触发?它们已经被绘制了,那为什么还要浪费资源呢?

有没有解决这个选择问题的方法?还是我必须限制datagrid中的最大记录数?

1个回答

3
您想要尝试的一件事是单元格的自适应大小,因为GridView必须浏览所有单元格以找到最长的单元格。您应该禁用自适应大小,并且应该通过编程方式完成。 关于您的选择问题:选择会导致大量重绘,我的直觉是它会重绘所有单元格,因此滞后与您的行/单元格计数成比例。
为了使用虚拟模式,您需要更多的设置VirtualMode为true。我们需要查看dataGridView1_RowsAdded,dataGridView1_CellValuePushed和dataGridView1_CellValidating方法,因为它们可能是延迟的罪魁祸首。

感谢这个技巧,我花了很长时间想知道为什么我的DataGridView在我通过同一BindingSource编辑一个数据绑定对象时会刷新所有行。 - Mika Tähtinen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接