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

Sam*_*Sam 4 c# datagridview winforms

我正在使用Windows窗体C#.

屏幕截图

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

问题:

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

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

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

TaW*_*TaW 13

您只需要使用DoubleBuffered DataGridview 子类:

class DBDataGridView : DataGridView
{
    public DBDataGridView() { DoubleBuffered = true; }
}
Run Code Online (Sandbox Code Playgroud)

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

我通过公共财产扩大了班级,允许开启DoubleBuffering和关闭..:

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

    public DBDataGridView()
    {
        DoubleBuffered = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

或者您可以使用这样的功能


Ram*_*rja 10

使用这个课程

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

并输入此代码.

this.dataGridView1.DoubleBuffered(true);
Run Code Online (Sandbox Code Playgroud)

请享用.


小智 9

在“FormLoad”函数中只需输入这行代码。

yourDataGridView.GetType().GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(yourDataGridView, true, null);
Run Code Online (Sandbox Code Playgroud)

并通过在顶部写入以下行来导入 BindingFlags。

using System.Reflection;
Run Code Online (Sandbox Code Playgroud)