两种方法使用双缓冲解决C# 中DataGridView和ListView 实时刷新数据时出现闪烁的问题

  • Post author:
  • Post category:其他



这两种方法都是开启双缓冲解决闪烁的,听起来很高大上,但实际也就一点点代码。


第一种,添加一个新类,这个类放在datagridview或ListView所在的窗体类外面就行,代码如下

class DoubleBufferDataGridView : DataGridView
{
    public DoubleBufferDataGridView()
    {
        SetStyle(ControlStyles.DoubleBuffer | ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
        //UpdateStatus.Continue;
        UpdateStyles();
    }
}


另外要注意在设计器的Designer.cs 文件中修改对datagridview或ListView 的声明即可,有两处如下


this.dataGridView1 = new System.Windows.Forms.DataGridView();  
 修改成下面这句即可
this.dataGridView1 = new DoubleBufferListView();



private System.Windows.Forms.DataGridView dgv_Device;
    修改成下面这句即可
private DoubleBufferDataGridView dgv_Device;


第二种方法,在datagridview或ListView所在的窗体类文件里面,比如Form1,另写一个扩展方法,代码如下

public static class DoubleBufferDataGridView
{
    /// <summary>
    /// 双缓冲,解决闪烁问题
    /// </summary>
    public static void DoubleBufferedDataGirdView(this DataGridView dgv, bool flag)
    {
        Type dgvType = dgv.GetType();
        PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic);
        pi.SetValue(dgv, flag, null);
    }
}


之后在窗体里调用上面的方法,如下

public Form1()
{
    InitializeComponent();

    /// 新添加这一句调用就行了,如果有ListViews也是这样添加,
    /// 但要注意方法里改为有关ListViews的声明即可
    DataGridView1.DoubleBufferedDataGirdView(true);
}

这两种方法只用其一就行,个人觉得后者应该会更好一些,前者也能正确运行达到效果,但有时候会导致设计器引用出错而查看不了控件。



版权声明:本文为m0_59565974原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。