摘要: 本文介绍了在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