在我的双显示器系统上,DataGridView 遇到了一个非常奇怪的问题。这个问题表现为对控件(大概30秒重新粉刷一遍)极其缓慢的重新绘制,但只有当它出现在我的一个屏幕上时才会出现。另一方面,重新刷漆的速度很好。
我有一个 Nvidia 8800 GT 与最新的非测试驱动程序(175。东西)。是司机的问题吗?我会把它留在空气中,因为我必须生活在这个特殊的配置。(不过,这种情况不会发生在 ATI 卡上... ...)
绘制速度与单元格内容无关,自定义绘制根本不能提高性能——即使只是绘制一个实心矩形。
后来我发现,放置一个 ElementHost (从系统。窗户。表格。集成命名空间)更正问题。它不需要被改动; 它只需要是 DataGridView 所在表单的子表单即可。只要 看得见属性为 true,就可以将其大小调整为(0,0)。
我不想显式地添加。NET 3/3.5对我的应用程序的依赖; 我创建了一个方法来使用反射在运行时创建这个控件(如果可以的话)。它能正常工作,而且至少在没有所需库的机器上它会优雅地失败——它只会回到慢的状态。
这个方法还允许我在应用程序运行时应用修复功能,这使得在我的表单上查看 WPF 库的更改变得更加容易(使用 Spy + +)。
经过大量的尝试和错误,我注意到在控件本身启用双缓冲(而不仅仅是窗体)可以纠正这个问题!
因此,您只需要基于 DataGridView 创建一个自定义类,这样就可以启用它的 DoubleBuffering。就是这样!
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}
只要我的所有网格实例都使用这个自定义版本,一切都很好。如果我曾经遇到这样的情况,我不能使用子类解决方案(如果我没有代码) ,我想我可以尝试注入该控件的形式:)(尽管我更可能尝试使用反射从外部强制 DoubleBuffered 属性,以再次避免依赖关系)。
这么简单的一件小事就占用了我这么多时间,真是可悲。