首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么DataGridView上的DoubleBuffered属性默认为false ?为什么它受到保护?

为什么DataGridView上的DoubleBuffered属性默认为false ?为什么它受到保护?
EN

Stack Overflow用户
提问于 2008-10-31 05:39:35
回答 4查看 21K关注 0票数 16

我们遇到了DataGridViews的性能问题,重绘速度非常慢,我们找到了解决方案Here来创建一个派生类型,并在控件上启用双缓冲。(派生类型是必需的,因为DoubleBuffered属性是受保护的)

将DoubleBuffered属性设置为true似乎没有任何缺点。

EN

回答 4

Stack Overflow用户

发布于 2012-04-23 16:30:58

我认为这是最好的解决方案:

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

找到here

票数 21
EN

Stack Overflow用户

发布于 2008-10-31 20:37:44

它是受保护的,因为DGV继承了Control的特性。Control.DoubleBuffered是受保护的。这是有意义的,因为每个派生控件都应该自己决定打开它。对于控件用户来说,随意打开或关闭它是没有意义的。DGV的设计师决定离开。

他们可能决定这样做的一个原因是双缓冲实际上会使绘制速度变慢。渲染缓冲区位图的额外步骤需要时间。在人眼看来,它看起来更快,你可以观察到突然出现的位图。您看不到绘制到位图所需的时间。除非需要绘制其他控件,并且它们在DGV之后得到它们的轮换,否则它是非常明显的。

您所看到的是窗体首先被绘制,控件所在的位置有孔。这些洞的背景是白色的。使用TransparencyKey或Opacity属性时为黑色。然后,每个控件都会获得Paint事件,并逐个填充空洞。这种效果也被用户感知为闪烁,尽管它是一种与DoubleBuffered解决的不同类型的闪烁。当背景为黑色时,这一点尤其明显。

需要解决这个问题的是,整个窗体及其所有控件都是双缓冲的。这在Windows窗体中不可用。但是,Windows XP和更高版本实际上支持此功能。查看this thread,看看是如何做到的。请注意,它可能会有副作用,如该线程中所述。

票数 19
EN

Stack Overflow用户

发布于 2008-10-31 08:19:15

根据定义,双缓冲使用两个缓冲区和两倍的内存来呈现控件的视图。因此,这里有一些缺点,然而,以你现在在PC中获得的内存量而言,可能没有多少人会注意到这种牺牲。

不知道为什么是受保护的。也许该功能在早期版本的控件中不可用,并且当它被引入时,设计者不想更改控件的公共接口。或者,也许他们认为这是一个高级功能,并希望限制新接触该控件的人必须摸索的方法的数量,以便能够使它做一些有用的事情。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/252689

复制
相关文章

相似问题

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