如何在水平滚动时防止DataGridView闪烁?

我正在使用Windows表单C#。

屏幕截图

如屏幕截图所示,我有一个Form,它有一个用户控件,一个tab控件和一个DataGridView(30行和17列)。 我从SQL Server读取数据以填充DataGrdiView。

问题:

当我水平滚动时, DataGridView闪烁很多。 然而,垂直滚动工作完美,没有闪烁。

我看过这里 , 这里 , 这里和这里,但没有一个与我的问题有关。

任何人都知道在水平滚动时阻止DataGridView闪烁的任何解决方案。

您只需要使用DoubleBuffered DataGridview 子类

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

也可以将双缓冲注入到正常的开箱即用控件中,但我更喜欢拥有自己的类,因为它在其他方面也是可扩展的。

我已经通过公共属性扩展了类,以允许打开和关闭DoubleBuffering ..:

 public class DBDataGridView : DataGridView { public new bool DoubleBuffered { get { return base.DoubleBuffered; } set { base.DoubleBuffered = value; } } public DBDataGridView() { DoubleBuffered = true; } } 

..并用200列2000行的负载测试它。 差异很明显; 而垂直滚动确实工作没有水平滚动需要DoubleBuffering ..

在此处输入图像描述

请注意,Form还具有DoubleBuffering属性,但不会传播到任何嵌入式控件!

使用这个课程

 public static class ExtensionMethods { public static void DoubleBuffered(this DataGridView dgv, bool setting) { Type dgvType = dgv.GetType(); PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic); pi.SetValue(dgv, setting, null); } } 

并输入此代码。

 this.dataGridView1.DoubleBuffered(true); 

请享用。