最近的项目中有一个模块中需要对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);
    }
}

 

 

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);
        }

    }

 

 

这样剩下的工作就只需要在Form的构造函数中设置一下就好了

 

 public FORM1()
{
    InitializeComponent();
    dgv.DoubleBuffered(
true);

}