我在C#中的合理时间内刷新DataGridView时遇到了问题(我是新手,我已经习惯了java ...)。
我通过网络获取数据,每秒发送20个包。我想解析数据并将其放在DataGridView中。我还想调整DataGridView的更新间隔,从0.1秒到1分钟。
所以我创建了一个额外的线程,它读取包并将它们解析为一个数组。我也有一个Timer,我用它来改变Interval。在每个计时器滴答声中,我将DataSource重新分配给DataGridView。
有趣的是,当我这样做时,即使我将计时器设置为0.1秒,它也只会被触发一次。如果我不刷新DataGridView,它会被触发10次,就像它应该的那样。
所以我假设我更新DataGridView的方法太耗时。但是我需要做些什么来提高它的效率,所以我可以每秒更新10次而没有任何问题?
以下是我使用的代码:
{{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
参数。