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.

现在还有一个ProgressBarMarquee风格的显示,让我们说5000+行滚动冻结Form,但我猜这只是一个问题线程/后台工作器等。

最让我害怕的是选择。有8000行并单击最后一行(8000)需要4.2秒来选择它。内容如下:

4000行则为2.1秒,以此类推。如果选择第8000行,最小化和最大化将花费4.2秒。选择第一行"使它"再次快乐。它的不可接受的。*为什么我的Form很难"标记"第8000行?

VirtualMode的分页工作完美,但选择是一个痛苦。

还有另一个问题/行为:

为什么当我将鼠标移动到行上时CellValueNeeded事件会引发?已经刷好了吗?那么为什么会浪费资源呢?

这个选择问题有什么解决方案吗?或者我必须限制数据网格中的最大记录

DataGridView, Virtual Mode and "lags"

您想要使用的一件事是单元格的自动大小,因为gridview必须遍历所有单元格以找到长度最长的单元格。您应该禁用自动调整大小,并且应该通过编程来实现。关于你的选择问题:选择导致很多重绘,我的直觉是,它重绘了你所有的单元格,因此延迟与你的行/单元格计数成正比。

为了使用VirtualMode,你需要的不仅仅是将VirtualMode设置为true。这将是有趣的看到您的dataGridView1_RowsAdded, datagridview1_cellvaluepush和datagridview1_cellvalididating方法,因为它们可能是延迟的罪魁祸首。