首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在我的两个屏幕中的一个屏幕上DataGridView的可怕重绘性能

在我的两个屏幕中的一个屏幕上DataGridView的可怕重绘性能
EN

Stack Overflow用户
提问于 2008-09-23 01:01:09
回答 9查看 50.3K关注 0票数 85

我已经解决了这个问题,但我把它发到了后世。

在我的双监视器系统中,DataGridView遇到了一个非常奇怪的问题。这个问题表现为控件的重绘速度非常慢(就像30秒时完全重新绘制),但只有在我的屏幕上时才会出现。另一方面,重新油漆的速度很好。

我有一个Nvidia 8800 GT与最新的非测试版驱动程序(175 )。某物)。是司机的窃听器吗?我会把它放在空中,因为我必须接受这种特殊的配置。( ATI卡上没有发生这种情况.)

绘制速度与单元格内容无关,而且自定义绘图根本无法提高性能--即使只是绘制一个实心矩形。

我后来发现,在表单上放置一个ElementHost (来自System.Windows.Forms.Integration命名空间)可以纠正这个问题。它不需要被搅乱;它只需要是DataGridView也在运行的表单的一个子级。只要可视属性为true,就可以将其大小调整为(0,0)。

我不想将.NET 3/3.5依赖项显式地添加到我的应用程序中;我使用反射创建了一个在运行时创建该控件的方法(如果可以的话)。它可以工作,至少在没有所需库的机器上,它会很好地失败--它又回到了缓慢的状态。

该方法还允许我在应用程序运行时应用修复程序,这样可以更容易地查看WPF库在我的表单上更改的内容(使用Spy++)。

经过大量的尝试和错误之后,我注意到在控件本身上启用双缓冲(相对于表单)可以纠正这个问题!

因此,您只需要基于DataGridView创建一个自定义类,以便启用它的DoubleBuffering。就这样!

代码语言:javascript
复制
class CustomDataGridView: DataGridView
{
    public CustomDataGridView()
    {
        DoubleBuffered = true;
    }
}

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

令人难过的是,这么简单的事情吞噬了我这么多时间.

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2008-10-01 12:41:14

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

代码语言:javascript
复制
class CustomDataGridView: DataGridView
{
    public CustomDataGridView()
    {
        DoubleBuffered = true;
    } 
}

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

令人难过的是,这么简单的事情吞噬了我这么多时间.

注意:让答案成为答案,这样问题就可以被标记为答案。

票数 66
EN

Stack Overflow用户

发布于 2009-10-01 19:49:51

下面是一些使用反射设置属性的代码,而不像Benoit建议的那样进行子类化。

代码语言:javascript
复制
typeof(DataGridView).InvokeMember(
   "DoubleBuffered", 
   BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
   null, 
   myDataGridViewObject, 
   new object[] { true });
票数 63
EN

Stack Overflow用户

发布于 2012-04-24 18:52:47

对于搜索如何在VB.NET中执行此操作的人员,下面是代码:

代码语言:javascript
复制
DataGridView1.GetType.InvokeMember("DoubleBuffered", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.SetProperty, Nothing, DataGridView1, New Object() {True})
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/118528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档