gridControl在同一列的不同行创建不同的控件(已CheckEidt搭配ButtonEdit为例)

简介: gridControl在同一列的不同行创建不同的控件(已CheckEidt搭配ButtonEdit为例)

近几日,在项目中,需要实现一个如下功能:

先放截图:

根据标识SpecFlag,在gridControl中,分别生成CheckEidt和ButtonEdit。

1.思路分析

根据经验,此类设计需要在代码中进行控件的创建,并为其设置相应的事件。在代码中,根据SpecFlag进行不同控件的创建,CheckEidt和ButtonEidt的创建方式与上篇单列全部使用RepositoryCheckEdit介绍的方式相似。

2.实现过程

1.声明全局变量

DevExpress.XtraEditors.Repository.RepositoryItemCheckEdit riCheck;
        DevExpress.XtraEditors.Repository.RepositoryItemButtonEdit riButton;

其实也可以在,创建部分进行声明,声明地点无所谓。

2.控件创建部分

/// <summary>
        /// 根据specflag构造列中的按钮或checkedit
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void gridView_data_CustomRowCellEdit(object sender, DevExpress.XtraGrid.Views.Grid.CustomRowCellEditEventArgs e)
        {
            if (e.Column.Name=="SpecFlag")
            {
                SpecialFormInfoModel model = gridView_data.GetRow(e.RowHandle) as SpecialFormInfoModel;
                if (!string.IsNullOrEmpty(model.SpecFlag) && (model.SpecFlag == "CLL-S"/*单套载重*/ || model.SpecFlag == "CLL-M"/*多套载重*/ || model.SpecFlag == "CEX-M"/*免除*/))
                {
                    riButton = this.repositoryItemButtonEdit;
                    e.RepositoryItem = riButton;
                }
                else
                {
                    riCheck = new DevExpress.XtraEditors.Repository.RepositoryItemCheckEdit();
                    riCheck.NullStyle = DevExpress.XtraEditors.Controls.StyleIndeterminate.Unchecked;
                    riCheck.ValueGrayed = false;
                    riCheck.QueryCheckStateByValue -= riCheck_QueryCheckStateByValue;
                    riCheck.QueryCheckStateByValue += riCheck_QueryCheckStateByValue;
                    riCheck.QueryValueByCheckState -= riCheck_QueryValueByCheckState;
                    riCheck.QueryValueByCheckState += riCheck_QueryValueByCheckState;
                    riCheck.CheckedChanged += riCheck_CheckedChanged;
                    e.RepositoryItem = riCheck;
                }
            }
        }

3.部分事件代码

        /// <summary>
        /// checkedit的值转换
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void riCheck_QueryValueByCheckState(object sender, DevExpress.XtraEditors.Controls.QueryValueByCheckStateEventArgs e)
        {
            switch (e.CheckState)
            {
                case CheckState.Checked:
                    e.Value = "True";
                    break;
                case CheckState.Indeterminate:
                    e.Value = "False";
                    break;
                case CheckState.Unchecked:
                    e.Value = "False";
                    break;
                default:
                    break;
            }
            e.Handled = true;
        }
        void riCheck_QueryCheckStateByValue(object sender, DevExpress.XtraEditors.Controls.QueryCheckStateByValueEventArgs e)
                {
                    string val = "";
                    if (e.Value!=null)
                    {
                        val = e.Value.ToString();
                    }
                    else
                    {
                        val = "False";
                    }
                    switch (val)
                    {
                        case "True":
                            e.CheckState = CheckState.Checked;
                            break;
                        case "False":
                            e.CheckState = CheckState.Unchecked;
                            break;
                        default:
                            break;
                    }
                    e.Handled = true;
                }

到此,标题所要实现的功能已经完成。但是!!!我在实现,双击右侧grid数据,将左侧相应数据的check状态取消的时候,发现,左侧CheckEdit的状态无法更新,即其实际状态为UnCheck的时候,界面已然是勾选状态,这个问题搞的我持续懵逼啊,经过一轮百度和测试,就在快要放弃的时候,找到了解决方案。。。。。。。,重点来了,重点来了,重点来了。

先上代码

        /// <summary>
        /// 双击已选列表删除本次添加数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        void gridView_selected_DoubleClick(object sender, EventArgs e)
        {
            CommSelectorModel curModel = this.gridView_selected.GetFocusedRow() as CommSelectorModel;
            if (curModel.IsWorkForm == "0")
            {
                selectedList.Remove(curModel);
                this.listData.FirstOrDefault(o => o.Id == curModel.ID && o.FormCode == curModel.FormCode).SpecFlag = "False"; //最重要的一句,即产生作用的一句
            }
            RefreshSel();
        }

原因是:

CheckedChanged触发后并未立即更新到数据源,因此勾选的该行状态在数据源中还是True,只有在焦点离开相应行时,才能更新到数据源。但是,此时,界面焦点在右侧grid,所以导致数据如法更新,必须手动更新才行。

所以直接将数据源中需要改变状态的行的标识修改为False即可。(因为选中时,是直接点击的CheckEdit,值会自动更新)

若不太明白,看一下:

若在绑定数据源的情况下实现只可单选,可以通过循环每行的状态来实现。

/// <summary>
/// 选择状态改变触发事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
 private void repositoryItemCheckEditKey_CheckedChanged(object sender, EventArgs e)
 {
     DataTable dt = gridControlDetial.DataSource as DataTable;
     for (int i = 0; i < dt.Rows.Count; i++)
     {
         dt.Rows[i][0] = false;
   }
     gridControlDetial.RefreshDataSource();
}

若还不是很明白,建议动手写个demo,打断点手动调试一下,根据运行前后和结果会很清晰的帮助你理解。

相关文章
PyQt5 技术篇-QTableWidget表格组件指定行的隐藏与显示控制实例演示,设置表格指定列的列宽方法
PyQt5 技术篇-QTableWidget表格组件指定行的隐藏与显示控制实例演示,设置表格指定列的列宽方法
624 0
PyQt5 技术篇-QTableWidget表格组件指定行的隐藏与显示控制实例演示,设置表格指定列的列宽方法
|
12月前
|
JavaScript 前端开发
datatable 自定义筛选按钮的解决方案
datatable 自定义筛选按钮的解决方案
140 0
|
人工智能 C#
c#中在datagridview的表格动态增加一个按钮方法
c#中在datagridview的表格动态增加一个按钮方法,如果想要这一套教程的可以移步去这里 《期末作业C#实现学生宿舍管理系统》,对了最近我们有一个人工智能交流群,如果大家对代码有问题,想交流的可以进群,私聊我就可以了! 效果图片 : 在Load事件中写入代码 那ui有了功能怎么办呢?别急我们在 dataGridView1_CellContentClick事件中添加方法 这样的话 我们就可以点击对应行的修改来获取到id的值这里有一个bug就是第三行没数据需要隐藏,现在还没有解决,欢迎大家指出!.....
603 0
c#中在datagridview的表格动态增加一个按钮方法
PyQt5 技术篇-设置QTableWidget表格组件默认值实例演示,如何获取QTableWidget表格组件里的值,获取表格的行数和列数
PyQt5 技术篇-设置QTableWidget表格组件默认值实例演示,如何获取QTableWidget表格组件里的值,获取表格的行数和列数
581 0
PyQt5 技术篇-设置QTableWidget表格组件默认值实例演示,如何获取QTableWidget表格组件里的值,获取表格的行数和列数
PyQt5 技术篇-QTableWidget表格组件的行选择与列选择实例演示,表格组件的双击事件捕获,获取表格选中单元格的值
PyQt5 技术篇-QTableWidget表格组件的行选择与列选择实例演示,表格组件的双击事件捕获,获取表格选中单元格的值
1113 0
PyQt5 技术篇-QTableWidget表格组件的行选择与列选择实例演示,表格组件的双击事件捕获,获取表格选中单元格的值
|
C# C++
C# WinForm 按钮下拉列(SplitButton)简单使用示例
关于SplitButton网上有很多的示例教程,这里我就以 https://wyday.com/splitbutton/ 为例给大家简单的讲解下。
4763 0
c#Winform修改datatable的列的操作和一些combox绑定实体类,dataGridview的注意点 弹出确认框 弹出的winform出现的位置 load
ds是DataSet 是Datatable的集合 ds.Tables[0]是得到第一张表 然后就是对dt的操作 将Fill_ID列名修改为 “序号” 依次修改列名 combox绑定list 显示combox上的值是用cmb_name 但是 在窗体加载的时候 cmb_name是 它本身的类型名字 而不是空 只有当它上面绑定有真正的值后才会显示。
1352 0

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    25
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    23
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    29
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    21
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    19
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    19
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19
  • 相关实验场景

    更多