相关疑难解决方法(0)

在我的两个屏幕之一上可怕的重绘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;
    }
}
Run Code Online (Sandbox Code Playgroud)

只要我的所有网格实例都使用这个自定义版本,一切都很好.如果我遇到由此引起的情况,我无法使用子类解决方案(如果我没有代码),我想我可以尝试将该控件注入表单:)(虽然我'将更有可能尝试使用反射来强制从外部启用DoubleBuffered属性再次避免依赖).

令人遗憾的是,这么简单的事情花了我很多时间......

.net performance datagridview nvidia winforms

81
推荐指数
5
解决办法
4万
查看次数

标签 统计

.net ×1

datagridview ×1

nvidia ×1

performance ×1

winforms ×1