在我的两个屏幕之一上,DataGridView的可怕的重绘性能
我实际上已经解决了这个问题,但我将其发布以供后代参考。
我的双显示器系统上的DataGridView遇到了一个非常奇怪的问题。此问题表现为控件的极慢重绘(例如,完整重绘需要30秒),但仅当它在我的一个屏幕上时才显示。另一方面,重绘速度很好。
我有Nvidia 8800 GT,带有最新的非beta驱动程序(175. )。是驱动程序错误吗?我将把它悬而未决,因为我必须忍受这种特殊的配置。 (不过,在ATI卡上不会发生这种情况...)
绘制速度与单元格内容无关,即使仅绘制实心矩形,自定义绘制也根本无法提高性能。
后来我发现,在窗体上放置ElementHost(来自System.Windows.Forms.Integration命名空间)可以解决此问题。它不一定要弄乱;它只是需要DataGridView形式的子对象。只要Visible属性为true,就可以将其调整为(0,0)。
我不想将.NET 3 / 3.5依赖项显式添加到我的应用程序中。我提出了一种使用反射在运行时创建此控件的方法(如果可以的话)。它可以正常工作,并且至少在没有所需库的机器上正常运行,只是恢复缓慢。
此方法还使我可以在应用程序运行时申请修复,从而可以更轻松地查看WPF库在表单上的变化(使用Spy ++)。
经过大量的试验和错误后,我注意到在控件本身(而不是仅表单)上启用双重缓冲可以解决此问题!
因此,我们只需要基于DataGridView创建自定义类,即可启用其DoubleBuffering。而已!
class CustomDataGridView: DataGridView { public CustomDataGridView() { DoubleBuffered = true; } }
只要我所有的网格实例都使用此自定义版本,一切都很好。如果遇到这种情况导致我无法使用子类解决方案(如果我没有代码),我想我可以尝试将该控件注入表格中:)(尽管我更有可能尝试使用反射从外部强制DoubleBuffered属性再次避免依赖)。
可惜如此琐碎的事情占用了我很多时间...
解决方案
我们只需要基于DataGridView创建一个自定义类,以便可以启用其DoubleBuffering。而已!
class CustomDataGridView: DataGridView { public CustomDataGridView() { DoubleBuffered = true; } }
只要我所有的网格实例都使用此自定义版本,一切都很好。如果遇到这种情况导致我无法使用子类解决方案(如果我没有代码),我想我可以尝试将该控件注入表格中:)(尽管我更有可能尝试使用反射从外部强制DoubleBuffered属性再次避免依赖)。
可惜如此琐碎的事情占用了我很多时间...
注意:将答案设为答案,以便将问题标记为已回答
在双监视器系统上使用.NET 3.0和DataGridView时,我们也遇到了类似的问题。
我们的应用程序将使用灰色背景显示网格,指示无法更改单元格。选择"更改设置"按钮后,程序将把单元格的背景颜色更改为白色,以向用户指示可以更改单元格文本。 "取消"按钮将把上述单元格的背景颜色变回灰色。
随着背景颜色的变化,将出现闪烁,这是具有相同大小的行和列的默认大小的网格的简短印象。仅在主监视器上(决不会在辅助监视器上)会发生此问题,而在单个监视器系统上不会发生此问题。
使用上面的示例对控件进行双重缓冲解决了我们的问题。非常感谢帮助。
只是添加了我们为解决此问题所做的工作:我们升级到了最新的Nvidia驱动程序解决了该问题。无需重写任何代码。
为了完整起见,该卡是Nvidia Quadro NVS 290,驱动程序日期为2008年3月(v。169)。升级到最新版本(2009年2月发布的第182版)极大地改善了我所有控件的绘画事件,尤其是对于DataGridView。
在任何ATI卡(发生开发)上均未发现此问题。
这是一些使用反射设置属性的代码,而没有Benoit建议的子类化。
typeof(DataGridView).InvokeMember( "DoubleBuffered", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty, null, myDataGridViewObject, new object[] { true });
我找到了解决问题的办法。转到高级显示属性中的"疑难解答"选项卡,然后检查硬件加速滑块。当我从IT处获得新的公司PC时,它被设置为满一刻,并且我对数据网格没有任何问题。更新视频卡驱动程序并将其设置为完整后,数据网格控件的绘制变得非常缓慢。所以我将其重置回原来的位置,问题消失了。
希望这个技巧也对我们有用。