19

(抱歉英语不好)

我对重新绘制时的性能有很大的问题。DataGridView

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

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

你能帮我提高DataGridView性能吗?

4

6 回答 6

46

我最近遇到了一些缓慢的问题,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它为对象打开双缓冲。只需致电DoubleBuffered()您的 DGV。希望能帮助到你。

编辑:我可能已经得到了这个,但我现在无法搜索原件,所以这只是为了强调代码不是我的。

于 2010-11-23T10:57:24.000 回答
9

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

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

如果你还没有一些想法

于 2010-11-23T10:57:33.130 回答
7

没有反射的清洁解决方案是:

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

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

于 2015-01-08T09:23:31.717 回答
3

另请阅读 MSDN 文章: 缩放 Windows 窗体 DataGridView 控件的最佳实践

于 2010-12-25T14:33:24.327 回答
3

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

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

于 2012-11-16T06:37:40.337 回答
3

我使用这个解决方案并看到了一些固定的东西。

使用反射,所以在代码中也导入它

using System.Reflection;

typeof(DataGridView).InvokeMember("DoubleBuffered",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
null,this.dataGridView1,new object[] { true });
于 2015-07-17T10:47:48.083 回答