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

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

先说原因,经过测试发现,当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加载数据缓慢)

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值