我已经解决了这个问题,但我把它发到了后世。
在我的双监视器系统中,DataGridView遇到了一个非常奇怪的问题。这个问题表现为控件的重绘速度非常慢(就像30秒时完全重新绘制),但只有在我的屏幕上时才会出现。另一方面,重新油漆的速度很好。
我有一个Nvidia 8800 GT与最新的非测试版驱动程序(175 )。某物)。是司机的窃听器吗?我会把它放在空中,因为我必须接受这种特殊的配置。( ATI卡上没有发生这种情况.)
绘制速度与单元格内容无关,而且自定义绘图根本无法提高性能--即使只是绘制一个实心矩形。
我后来发现,在表单上放置一个ElementHost (来自System.Windows.Forms.Integration命名空间)可以纠正这个问题。它不需要被搅乱;它只需要是DataGridView也在运行的表单的一个子级。只要可视属性为true,就可以将其大小调整为(0,0)。
我不想将.NET 3/3.5依赖项显式地添加到我的应用程序中;我使用反射创建了一个在运行时创建该控件的方法(如果可以的话)。它可以工作,至少在没有所需库的机器上,它会很好地失败--它又回到了缓慢的状态。
该方法还允许我在应用程序运行时应用修复程序,这样可以更容易地查看WPF库在我的表单上更改的内容(使用Spy++)。
经过大量的尝试和错误之后,我注意到在控件本身上启用双缓冲(相对于表单)可以纠正这个问题!
因此,您只需要基于DataGridView创建一个自定义类,以便启用它的DoubleBuffering。就这样!
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}只要我所有的网格实例都使用这个自定义版本,一切都是好的。如果遇到这种情况,我无法使用子类解决方案(如果我没有代码),我想我可以尝试将该控件注入表单:) (尽管我更有可能尝试使用反射来强制DoubleBuffered属性从外部再次避免依赖)。
令人难过的是,这么简单的事情吞噬了我这么多时间.
发布于 2008-10-01 12:41:14
您只需要基于DataGridView创建一个自定义类,这样就可以启用它的DoubleBuffering。就这样!
class CustomDataGridView: DataGridView
{
public CustomDataGridView()
{
DoubleBuffered = true;
}
}只要我所有的网格实例都使用这个自定义版本,一切都是好的。如果遇到这种情况,我无法使用子类解决方案(如果我没有代码),我想我可以尝试将该控件注入表单:) (尽管我更有可能尝试使用反射来强制DoubleBuffered属性从外部再次避免依赖)。
令人难过的是,这么简单的事情吞噬了我这么多时间.
注意:让答案成为答案,这样问题就可以被标记为答案。
发布于 2009-10-01 19:49:51
下面是一些使用反射设置属性的代码,而不像Benoit建议的那样进行子类化。
typeof(DataGridView).InvokeMember(
"DoubleBuffered",
BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.SetProperty,
null,
myDataGridViewObject,
new object[] { true });发布于 2012-04-24 18:52:47
对于搜索如何在VB.NET中执行此操作的人员,下面是代码:
DataGridView1.GetType.InvokeMember("DoubleBuffered", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance Or System.Reflection.BindingFlags.SetProperty, Nothing, DataGridView1, New Object() {True})https://stackoverflow.com/questions/118528
复制相似问题