devexpress中gridview控件实现多选功能

          前段时间做一个项目winform项目时,有个模块需要用到一个功能,在gridcontrol的表头添加一个checkedit,用户点击checkedit时全选或者取消全选数据。

在网上搜了很多文章,大致有两类实现,一个是http://www.cnblogs.com/wuhuacong/archive/2011/12/30/2307600.html 还有一个是http://www.tuicool.com/articles/yemuEj

最开始我采用的是第一个,可以实现点击表头的checkedit全选,如下图所示devexpress中gridview控件实现多选功能_第1张图片;但是却没法实现另外一个功能,当你全选之后,去掉选中一条数据时,表头还是显示全选状态,如下图所示。devexpress中gridview控件实现多选功能_第2张图片;或者当用户手动把所有数据勾选选中后,select应该自动勾选上。但是在第一个版本里无法实现。无奈,只能寻找其它实现方法。然后就找到了第二个版本。也是我同事以前所用的。他以前做项目时用到了这个功能,并且实现了,当时我本着自力更生的观念没有用,但是现实项目要上线,容不得我太多时间去寻找别的方法。只能采用第二个版本的方法。

        采用只有在我本地调试后没任何问题,各种想要的功能也都实现了。但是到了测试那边通不过,当取消勾选一条数据时,那条数据的select行显示为空白,连控件都看不到了,然后把鼠标移开后才显示出来。根据经验应该是gridcontrol没刷新,试了各种办法还是没解决。哎,只能叹命不好,同样的代码,同样的机器,我同事的模块就没问题,我的模块就不行。只能寻找别的办法。然后就研究了下这两个办法。找到了一个可行的解决方案,还是采用第一个版本。然后在用户点击checkedit的事件中实现如下代码

void repositoryItemCheckEdit1_CheckedChanged(object sender, EventArgs e)
        {
            CheckEdit ce = sender as CheckEdit;
            if (ce != null)
            {

                //Po 为gridcontrol的一个属性类,用来绑定数据源的
                Po p1 = this.gridView1.GetRow(this.gridView1.FocusedRowHandle) as Po;

                // 改变用户选中或取消那一行数据的值状态
                p1.Select = ce.Checked;
                int count = dataSource.Count;

                // 改变全局变量m_checkStatus的值为true,并遍历数据源,给m_checkStatus赋值
                m_checkStatus = true;
                for (int i = 0; i < count; i++)
                {
                    Po p = dataSource[i];
                    if (!p.Select)
                    {
                        m_checkStatus = false;
                        break;
                    }                   
                }

                //  最关键的一行代码,没有这一行,会出现你挨个选中了所有数据后,表头没有自动勾选,鼠标放上去才勾选的bug。

                // 亦是因为控件未刷新的原因
                this.gridControl1.Refresh();
            }
        }

说明,我这个方法是用devexpress的gridcontrol实现的。对版本一不同之处是我没有添加this.gridView1.DataSourceChanged这个事件。gridcontrol中的checkedit是通过columnrdit绑定repositoryItemCheckEdit1控件实现的。

第一次写文章,不当之处请轻喷。

你可能感兴趣的:(winform)