DataGridView以及DotNetBar中的DatagridviewX防止闪烁的方法
最近的项目中有一个模块中需要对datagridview中的单元格进行着色,在datagridview的CellFormatting事件中加入着色代码后,功能实现,但是因为涉及到单元格的重画,所以数据一多会产生闪烁的情况,设置了几个参数都未能解决,遂感觉可能需要对画图的方法进行优化,马上就想到了双缓存,而在MSDN上的Datagridview的却明确表示并不支持双缓存,这让我感到很奇怪。后来,又查询了很多资料才弄清楚,原来Datagridview是有双缓存机制的,但是不知道为什么微软将它隐藏了,但是非常幸运的是,微软并没有完全屏蔽双缓存,你可以通过反射来设置它。
代码如下:
1.针对微软的Datagridview控件
你可以自己方案中添加一个方法
Datagridview双缓存机制
public static class ExtensionMethods
{
{
//使用扩展方法
public static void DoubleBuffered(this DataGridView dgv, bool setting)
{
Type dgvType = dgv.GetType();
PropertyInfo pi = dgvType.GetProperty(“DoubleBuffered“,
BindingFlags.Instance | BindingFlags.NonPublic);
pi.SetValue(dgv, setting, null);
}
}
public static void DoubleBuffered(this DataGridView dgv, bool setting)
{
Type dgvType = dgv.GetType();
PropertyInfo pi = dgvType.GetProperty(“DoubleBuffered“,
BindingFlags.Instance | BindingFlags.NonPublic);
pi.SetValue(dgv, setting, null);
}
}
2.针对DotNetBar的DatagridviewX控件
因为我在程序中使用了第三方控件DotNetbar美化界面,所以使用的是DotNetBar的DatagridviewX控件
程序也相应的修改为
DatagridviewX双缓存机制
public static class DoubleBuff
{
//使用扩展方法
public static void DoubleBuffered(this DevComponents.DotNetBar.Controls.DataGridViewX dgv, bool setting)
{
Type dgvType = dgv.GetType();
PropertyInfo pi = dgvType.GetProperty(“DoubleBuffered“,
BindingFlags.Instance | BindingFlags.NonPublic);
pi.SetValue(dgv, setting, null);
}
{
//使用扩展方法
public static void DoubleBuffered(this DevComponents.DotNetBar.Controls.DataGridViewX dgv, bool setting)
{
Type dgvType = dgv.GetType();
PropertyInfo pi = dgvType.GetProperty(“DoubleBuffered“,
BindingFlags.Instance | BindingFlags.NonPublic);
pi.SetValue(dgv, setting, null);
}
}
这样剩下的工作就只需要在Form的构造函数中设置一下就好了
public FORM1()
{
InitializeComponent();
dgv.DoubleBuffered(true);
{
InitializeComponent();
dgv.DoubleBuffered(true);
}