我已经解决了这个问题,但我要把它传给后代.

我在双监视器系统上的DataGridView遇到了一个非常奇怪的问题.这个问题表现为控件(like 30 seconds for a full repaint)的重新绘制速度非常慢,但只有当它出现在我的一个屏幕上时才会出现.另一方面,重新绘制的速度很好.

我有一台NVIDIA 8800GT,带有最新的非测试版驱动程序(175.某些东西).是驱动程序缺陷吗?我将把它放在一边,因为我必须接受这个特殊的配置.(不过,ATI卡上不会发生这种情况…)

绘制速度与单元格内容无关,自定义绘制根本不会提高性能-即使只是绘制一个实心矩形.

我后来发现,在表单上放置ElementHost(来自System.Windows.Forms.Integration命名空间)可以纠正这个问题.它不必被弄乱;它只需要是DataGridView所在表单的子级.只要Visible属性为真,就可以将其大小调整为(0,0).

我不想明确地添加.NET 3/3.5对我的应用程序的依赖性;我使用反射创建了一个在运行时(如果可以)创建此控件的方法.它可以工作,至少在没有所需库的机器上,它会优雅地失败——它只是又变慢了.

此方法还允许我在应用程序运行时应用FIX,从而更容易看到WPF库在我的表单(使用Spy++)上所做的更改.

经过多次try 和错误,我注意到在控件本身(而不仅仅是窗体)上启用双缓冲可以纠正这个问题!


因此,您只需要基于DataGridView创建一个自定义类,这样就可以启用它的DoubleBuffering.就这样!

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

只要我的所有网格实例都使用这个定制版本,一切都很好.如果我遇到这种情况,无法使用子类解决方案(如果我没有代码),我想我可以try 将该控件注入表单:)(although I'll be more likely to try using reflection to force the DoubleBuffered property on from the outside to once again avoid the dependency).

令人难过的是,这么简单的一件小事占用了我这么多时间……

推荐答案

您只需要基于DataGridView创建一个自定义类,这样就可以启用它的双缓冲.就这样!


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

只要我的所有网格实例都在使用这个自定义版本,一切都很好.如果我遇到因此而无法使用子类解决方案的情况(如果我没有代码),我想我可以try 将该控件注入Form:)(尽管我更有可能try 使用反射从外部强制启用DoubleBuffered属性,以再次避免依赖项).在这种情况下,如果我遇到无法使用子类解决方案的情况(如果我没有代码),我可以try 将该控件注入Form:)(尽管我更有可能try 从外部强制启用DoubleBuffered属性,以再次避免依赖).

令人难过的是,这么简单的一件小事占用了我这么多时间……

注意:将答案设为答案,以便可以将问题标记为已回答

.net相关问答推荐

节省用户在整个应用程序中使用的Flutter

.NET Core 中的微服务

EGC / 文本元素上的 .NET String.Split

无法通过构建目标访问 dotnet 的环境变量

无法实例化类的代理:System.Net.HttpWebRequest.找不到无参数构造函数

在 Git for Visual Studio 2012 中恢复到以前的提交

如何创建 LINQ to SQL 事务?

在生产中使用实体框架(代码优先)迁移

如何使用 C# 中的代码更改网络设置(IP 地址、DNS、WINS、主机名)

如何摆脱 VS2008 中的目标程序集不包含服务类型错误消息?

多个等待与 Task.WaitAll - 等效?

使用 .NET 中的代码更改桌面墙纸

Mono 是树莓派

从 Windows 窗体打开 URL

如何从 .NET 中的流中获取 MemoryStream?

加载程序集、查找类和调用 Run() 方法的正确方法

为什么会出现编译错误使用未分配的局部变量?

在任务中捕获异常的最佳方法是什么?

ADO.NET Entity Framework:更新向导不会添加表

如何使用 AutoMapper .ForMember?