非常频繁地更新datagridview

时间:2017-05-25 16:21:11

标签: c# datagridview

我在C#中的合理时间内刷新DataGridView时遇到了问题(我是新手,我已经习惯了java ...)。

我通过网络获取数据,每秒发送20个包。我想解析数据并将其放在DataGridView中。我还想调整DataGridView的更新间隔,从0.1秒到1分钟。

所以我创建了一个额外的线程,它读取包并将它们解析为一个数组。我也有一个Timer,我用它来改变Interval。在每个计时器滴答声中,我将DataSource重新分配给DataGridView。

有趣的是,当我这样做时,即使我将计时器设置为0.1秒,它也只会被触发一次。如果我不刷新DataGridView,它会被触发10次,就像它应该的那样。

所以我假设我更新DataGridView的方法太耗时。但是我需要做些什么来提高它的效率,所以我可以每秒更新10次而没有任何问题?

以下是我使用的代码:

{{1}}

1 个答案:

答案 0 :(得分:5)

您要更新的单元格数以及您想要的更新率是否足以导致闪烁滞后

为避免这种情况,您可以为def printString(s, lst): for i in range(len(lst)): resultString = s[lst[i]] print (resultString) 打开DoubleBuffering

默认情况下不会公开此属性。所以有一个选择

  • 创建子类
  • 通过反射
  • 访问它

Here is a post演示前者。它是针对滚动闪烁的情况编写的,但也有助于避免更新滞后。该课程可能如下所示:

DataGridView

您可以将此类添加到项目中,或者只添加到表单类(最后一个卷曲之前)。编译并显示在ToolBox中。

另一个选项使用反射;这是一个适用于任何类型控件的通用函数:

public class DBDataGridView : DataGridView
{
    public new bool DoubleBuffered
    {
        get { return base.DoubleBuffered; }
        set { base.DoubleBuffered = value; }
    }

    public DBDataGridView()
    {
        DoubleBuffered = true;
    }
}

两种方式都允许您随意打开和关闭using System.Reflection; static void SetDoubleBuffer(Control ctl, bool DoubleBuffered) { typeof(Control).InvokeMember("DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty, null, ctl, new object[] { DoubleBuffered }); } ;前者通过现在公开的属性,后者通过方法的DoubleBuffering参数。