Flickering during updates to Controls in WinForms (e.g. DataGridView)在我的应用程序中,我有一个DataGridView控件,该控件显示所选对象的数据。 当选择其他对象时(在上面的组合框中),我需要更新网格。 不幸的是,不同的对象具有完全不同的数据,甚至具有不同的列,因此我需要清除所有现有数据和列,创建新列并添加所有行。 完成此操作后,整个控件将可怕地闪烁,并且需要很长时间。 有没有一种通用的方法可以使控件处于更新状态,以便它不会重新绘制自身,而是在完成所有更新后重新绘制它? TreeViews当然是可能的:
是否有通用方法可以与其他控件(特别是DataGridView)一起使用? 更新:对不起,我不确定我是否足够清楚。 我看到"闪烁",因为在单次编辑后,控件将重新绘制在屏幕上,因此您可以看到滚动条缩小等。 人们似乎忘记了一个简单的解决方案:
我知道这看起来很奇怪,但是可以。当对象不可见时,它不会重绘自身。但是,您仍然需要进行 .NET控件支持SuspendLayout和ResumeLayout方法。选择适当的父控件(即托管要填充的控件的控件),然后执行以下操作:
双缓冲在这里无济于事,因为只有双缓冲绘画操作,OP看到的闪烁是多次绘画操作的结果:
因此需要四次重绘以更新控件,从而实现闪烁。不幸的是,并非所有标准控件都具有BeginUpdate / EndUpdate,它将删除所有重画调用,直到调用EndUpdate。您可以执行以下操作: 选项1和2仍会闪烁。 在我正在使用的.Net GUI程序上,我创建了一组自定义控件,这些控件消除了所有闪烁。
而不是一次添加一个数据网格的行,而是使用 这对我有用。 http://www.syncfusion.com/faq/windowsforms/search/558.aspx 基本上,它涉及从所需的控件派生并设置以下样式。
不幸的是,我认为Thins可能只是.net框架的副产品。尽管使用自定义控件,但我也遇到了类似的闪烁。我阅读的许多参考资料都表明了这一点,同时双重缓冲方法无法消除任何闪烁。 听起来像您想要双重缓冲: http://www.codeproject.com/KB/graphics/DoubleBuffering.aspx 尽管此方法主要用于单个控件,但是您可以在Windows Forms控件或Form中实现它。 您也可以尝试此操作。
|