如何提高DataGridView的绘画性能?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何提高DataGridView的绘画性能?相关的知识,希望对你有一定的参考价值。

(抱歉英文不好)

当重新涂漆时,我对DataGridView的性能有很大的问题。

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

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

你能帮助我提高DataGridView的表现吗?

答案

我最近与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);
}

它为DataGridView对象变成了双缓冲。只需在您的DGV上拨打DoubleBuffered()即可。希望能帮助到你。

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

另一答案

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

看看Horrible redraw performance of the DataGridView on one of my two screens

如果你还没有一些想法

另一答案

没有反射的清洁溶液是:

public class DataGridViewDoubleBuffered : DataGridView
{
   public DataGridViewDoubleBuffered()
   {
       DoubleBuffered = true;
   }
}

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

另一答案

另请阅读MSDN文章:Best Practices for Scaling the Windows Forms DataGridView Control

另一答案

使用大量数据时,DataGridView控件可能会消耗大量内存,除非您小心使用它。在内存有限的客户端上,您可以通过避免具有高内存成本的功能来避免一些此类开销。

您还可以使用虚拟模式自行管理部分或全部数据维护和检索任务,以便自定义方案的内存使用情况。更多细节你可以访问dapfor。 COM

另一答案

我使用这个解决方案,看到有点固定。

使用反射,因此也可以在代码中导入

using System.Reflection;

typeof(DataGridView).InvokeMember("DoubleBuffered",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
null,this.dataGridView1,new object[] { true });

以上是关于如何提高DataGridView的绘画性能?的主要内容,如果未能解决你的问题,请参考以下文章

如何提高基于视图的查询性能?

winform中的DataGridView如何实现分页(C#)

梵奈颜料A系列耐晒性能测试周记

如何提高 OpenMP 代码的性能?

java中大量数据如何提高性能?

如何依靠代码提高网络性能