如何提高DataGridView的绘画性能?

Yur*_*riy 18 .net datagridview paint repaint winforms

(抱歉英文不好)

我重新涂漆时的性能存在很大问题DataGridView.

我正在使用a DataGridView来显示来自外部应用程序流的日志.来自流的消息以高频率(小于1毫秒)进入.如果我DataGridView在每条新消息到来时立即添加新行,DataGridView则在下一条消息到来之前没有时间重新绘制自己.

一种可能的解决方案是使用队列来收集消息,并使用队列中的消息DataGridView每100毫秒重新绘制一次.这很好但是DataGridView当它自动滚动到最后一行时闪烁.(禁用平滑滚动)

你能帮助我改善DataGridView表现吗?

dan*_*n78 43

我最近有一些缓慢的问题,DataGridView解决方案是以下代码

public static void DoubleBuffered(this DataGridView dgv, bool setting)
{
    Type dgvType = dgv.GetType();
    PropertyInfo pi = dgvType.GetProperty("DoubleBuffered",
          BindingFlags.Instance | BindingFlags.NonPublic);
    pi.SetValue(dgv, setting, null);
}
Run Code Online (Sandbox Code Playgroud)

它会对DataGridView对象进行双缓冲.只需打电话DoubleBuffered()给你的DGV.希望能帮助到你.

编辑:我可能已经把它关闭了,但我现在无法搜索原文,所以这只是为了强调代码不是我的.

  • 您发布的方法使用反射来更改`DataGridView`控件上的非公共属性.这是一个可接受的解决方案,但是继承现有的`DataGridView`控件并使用"DoubleBuffered"样式集创建自己的自定义控件可能更简洁. (9认同)

小智 9

您是否为网格视图启用了双缓冲?

看看 我的两个屏幕之一的DataGridView的可怕重绘性能

如果你还没有一些想法


Tom*_*bes 6

没有反射的清洁溶液是:

public class DataGridViewDoubleBuffered : DataGridView
{
   public DataGridViewDoubleBuffered()
   {
       DoubleBuffered = true;
   }
}
Run Code Online (Sandbox Code Playgroud)

然后转到myForm.designer.cs并将类型从DataGridView更改为DataGridViewDoubleBuffered.

  • 谢谢你 - 这是昼夜不同.对于想知道如何执行此操作的人 - 将此类添加到代码的底部 - 我将其添加到我的表单类之外的命名空间中.然后,打开表单的`Designer.CS`(`Form1.Designer.cs`)并单击`Windows Form Designer生成的代码`旁边的`+`符号取消隐藏该部分.更改datagridview初始化(类似于`this.dataGridView1 = new System.Windows.Forms.DataGridView`) - 将其更改为`this.dataGridView1 = new DataGridViewDoubleBuffered`.然后,向下滚动到它有声明的底部. (3认同)
  • 将声明(“私有System.Windows.Forms.DataGridView dataGridView1”)更改为“私有DataGridViewDoubleBuffered dataGridView1”。我还继续将表格设置为双缓冲-可能值得一做-不知道是否有必要。 (2认同)