我已经解决了这个问题,但我要把它传给后代.
我在双监视器系统上的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).
令人难过的是,这么简单的一件小事占用了我这么多时间……