2011-11-24 98 views
2

我的代码如下:DataGridView中,虚拟模式和 “滞后”

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是只读的。

现在还那里有一个ProgressBarMarquee风格,让我发现,有让说5000+行滚动冻结线程的Form但我猜它只是一个问题/ BackgroundWorker的等

最令我害怕的是选择。有8000行和点击最后一个(8000)需要我的形式4.2秒来选择它。其如下:

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

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

也Theres另一个问题/行为:

为什么当IM移动我的鼠标在列CellValueNeeded事件引发的?他们已经画了?那为什么它浪费资源?

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

回答

2

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

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

+0

感谢您的提示,花了很长时间想知道为什么我通过相同的BindingSource编辑数据绑定对象时,为什么我的DataGridView保持刷新所有行。 –

相关问题