DataGridView以及DotNetBar中的DatagridviewX防止闪烁的方法

来源:互联网 发布:淘宝网水兵舞裙子 编辑:程序博客网 时间:2024/06/05 10:22


最近的项目中有一个模块中需要对datagridview中的单元格进行着色,在datagridview的CellFormatting事件中加入着色代码后,功能实现,但是因为涉及到单元格的重画,所以数据一多会产生闪烁的情况,设置了几个参数都未能解决,遂感觉可能需要对画图的方法进行优化,马上就想到了双缓存,而在MSDN上的Datagridview的却明确表示并不支持双缓存,这让我感到很奇怪。后来,又查询了很多资料才弄清楚,原来Datagridview是有双缓存机制的,但是不知道为什么微软将它隐藏了,但是非常幸运的是,微软并没有完全屏蔽双缓存,你可以通过反射来设置它。


我使用的系统是windows2003,IDE是VS2008,开发语言是c#


代码如下:


 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
    {
        //DevComponents.DotNetBar.Controls.DataGridViewX
        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_BaseStation.DoubleBuffered(true);


}
 


 


其中dgv_BaseStation是我的Datagridview和DatagridviewX的实例名。


至此,大功告成,一切运行正常。


原创粉丝点击