我实际上已经解决了这个问题,但我将其发布给后代。
我在双显示器系统上的 DataGridView 遇到了一个非常奇怪的问题。该问题表现为控件重绘极其缓慢(完全重绘大约需要 30 秒),但仅当它出现在我的其中一个屏幕上时。另一方面,重绘速度很好。
我有一台 Nvidia 8800 GT,带有最新的非测试版驱动程序(175. 一些)。这是驱动程序错误吗?我将把这个问题悬而未决,因为我必须忍受这种特殊的配置。 (不过,在 ATI 卡上不会发生这种情况......)
绘制速度与单元格内容无关,并且自定义绘制根本不会提高性能 - 即使仅绘制实心矩形也是如此。
后来我发现在表单上放置 ElementHost(来自 System.Windows.Forms.Integration 命名空间)可以解决该问题。它不必被弄乱;它只需要是 DataGridView 所在表单的子级即可。只要将其大小调整为 (0, 0)Visible财产是真实的。
我不想将 .NET 3/3.5 依赖项显式添加到我的应用程序中;我创建了一种使用反射在运行时(如果可以的话)创建此控件的方法。它可以工作,并且至少在没有所需库的机器上它会优雅地失败 - 它只是变慢了。
此方法还允许我在应用程序运行时应用修复,从而更轻松地查看 WPF 库在我的表单上发生的更改(使用 Spy++)。
经过大量的试验和错误后,我注意到在控件本身上启用双缓冲(而不是仅仅在表单上)可以解决这个问题!
因此,您只需要创建一个基于 DataGridView 的自定义类,这样您就可以启用它的 DoubleBuffering。就是这样!
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}
只要我的所有网格实例都使用这个自定义版本,一切都很好。如果我遇到由此导致的情况,我无法使用子类解决方案(如果我没有代码),我想我可以尝试将该控件注入到表单中:)(尽管我更有可能尝试使用反射从外部强制使用 DoubleBuffered 属性,以再次避免依赖性).
可惜这么简单的事情却占用了我这么多的时间......