如何提高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的绘画性能?的主要内容,如果未能解决你的问题,请参考以下文章