DataGridView,虚拟模式和“滞后”

时间:2011-11-24 16:37:15

标签: c# winforms datagridview selection virtualmode

我的代码如下:

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事件?他们已经画了?那为什么要浪费资源?

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

1 个答案:

答案 0 :(得分:2)

您想要玩的一件事是细胞的自动调整,因为gridview必须遍历所有细胞才能找到长度最长的细胞。您应该禁用自动调整,您应该以编程方式执行此操作。 关于您的选择问题:选择导致大量重绘,我的预感是重绘所有单元格,因此滞后与行/单元格数成正比。

要使用虚拟模式,您需要的不仅仅是将VirtualMode设置为true。看看你的dataGridView1_RowsAdded,dataGridView1_CellValuePushed和dataGridView1_CellValidating方法会很有趣,因为它们可能是延迟的罪魁祸首。