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;
            }
  • ArrayOfRecordsstring[]每秒更新 10-100 个新对象。
  • VirtualMode设置为真。
  • SelectionMode设置为FullRowSelect
  • dataGridView是只读的。

现在还有一个ProgressBarwithMarquee样式,它告诉我说 5000+ 行滚动冻结,Form但我想这只是线程/后台工作人员等的问题。

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

4000 行使其需要 2.1 秒等。如果选择第 8000 行最小化,然后最大化需要 4.2 秒。选择第 1 行“使它”再次快乐。这是不可接受的。*为什么为我的“标记”第 8000 行这么难Form

VirtualMode 的分页效果很好,但选择很痛苦。

还有另一个问题/行为:

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

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

4

1 回答 1

3

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

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

于 2012-02-19T09:35:26.967 回答