鳕鱼天空

This is Mr Wang's Tech Blog.

c# datagridview加双缓中解决闪烁问题

摘要: 本文介绍了在C#Winform中,当DataGridView和ListView加载大量数据时遇到卡顿和闪烁问题的解决方案。方法一是重写CreateParams属性启用双缓冲,方法二是通过反射设置控件的DoubleBuffered属性。两种方法都能提高控件的绘制性能并减少闪烁。

先说原因,经过测试发现,当datagridview中加载大量数据时,拖拽进行放大缩小时,会有明显卡顿的感觉

解决办法1:

      /// <summary>
      /// 重写CreateParams属性的get访问器,目的是为了设置控件的窗口样式,以启用双缓冲功能,解决闪烁问题
      /// </summary>
      protected override CreateParams CreateParams
      {
          get
          {
              //首先获取基类的CreateParams属性,保存到变量cp中。这些参数包含了控件的基本创建信息
              CreateParams cp = base.CreateParams;
     
              //对cp的扩展样式进行位或操作(|=),将0x02000000这个标志添加到现有样式中。
              //这个特定的十六进制值对应于WS_EX_COMPOSITED窗口样式,
              //它可以强制控件及其所有子控件进行全部重新绘制,实现双缓冲效果,进而提升控件的绘制性能,减少闪烁。
              cp.ExStyle |= 0x02000000;
              return cp;
          }
     
      }

解决办法2:

创建一个类,在方法内部设置控件的双缓冲属性

    public static class DoubleBufferedDataGridView
     {
         /// <summary>
         /// 通过双缓冲技术,解决DataGridView或ListView的闪烁问题
         /// </summary>
         public static void DoubleBufferedDataGirdView(this DataGridView dgv, bool flag)
         {
             //获取传入的DataGridView对象的类型。
             Type dgvType = dgv.GetType();
     
             //使用反射技术查找DataGridView类型中的一个非公共实例属性
             PropertyInfo pi = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance | BindingFlags.NonPublic)!;
             
             //调用PropertyInfo对象的SetValue方法来设置DataGridView控件的DoubleBuffered属性值
             pi.SetValue(dgv, flag, null);
         }
     }

然后在构造方法中调用该方法即可

    public Form1()
    {
        InitializeComponent();
      
        //设置双缓冲,解决闪烁
        dataGridView1.DoubleBufferedDataGirdView(true);
    }

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

使用双缓冲技术解决winform窗体控件卡顿(dataGridView加载数据缓慢)

原文链接:https://blog.csdn.net/weixin_49297068/article/details/137453565

 

Add comment

Loading