【无标题】

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

  • 第一种方法
  • 第二种方法

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

第一种方法

添加一个新类,这个类放在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
{
    /// 
    /// 双缓冲,解决闪烁问题
    /// 
    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);
}

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

原文链接:https://blog.csdn.net/m0_59565974/article/details/120023689

你可能感兴趣的:(c#,开发语言)