gpt4 book ai didi

.net - DataGridView 在我的两个屏幕之一上的重绘性能非常糟糕

转载 作者:行者123 更新时间:2023-12-03 05:12:11 32 4
gpt4 key购买 nike

我实际上已经解决了这个问题,但我将其发布给后代。

我在双显示器系统上的 DataGridView 遇到了一个非常奇怪的问题。该问题表现为控件重绘速度极其缓慢(完整重绘大约需要 30 秒),但仅限于我的其中一个屏幕上时。另一方面,重绘速度很好。

我有一个 Nvidia 8800 GT,带有最新的非测试版驱动程序(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;
}
}

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

可悲的是,这样一个简单的事情占用了我这么多的时间......

最佳答案

您只需创建一个基于 DataGridView 的自定义类,以便可以启用其 DoubleBuffering。就是这样!


class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}

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

可悲的是,这样一个简单的事情占用了我这么多的时间......

注意:将答案作为答案,以便将问题标记为已回答

关于.net - DataGridView 在我的两个屏幕之一上的重绘性能非常糟糕,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/118528/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com