C# DevExpress高级篇 | GridLookUpEdit组件使用|C/S开发框架
作者:csframework|C/S框架网  发布日期:2023/09/10 20:25:24

C# DevExpress高级篇 | GridLookUpEdit组件使用|C/S开发框架

一、前言

作者目前在开发一套大型ERP系统时用到GridLookUpEdit组件,用户有一些特殊要求非常棘手,研究了半天终于整出来了,分享出来给大家。

C# DevExpress高级篇 | GridLookUpEdit组件使用|C/S开发框架

二、GridLookUpEdit 组件特殊要求

2.1、支持输入新值

如下图所示,用户要求【货号】列能输入新值,当下拉窗体的【货号】不存时要求录入新货号。

C# DevExpress高级篇 | GridLookUpEdit组件使用|C/S开发框架

要求能录入XYZ新货号。

解决方案:

C# 全选
 //在输入框录入新值处理事件
 rep_Grid.ProcessNewValue += OnGrid_ProcessNewValue; 

C# 全选
        /// <summary>
        /// 输入新值,若下拉窗体没有匹配数据,自动添加到下拉表格的数据源
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnGrid_ProcessNewValue(object sender, DevExpress.XtraEditors.Controls.ProcessNewValueEventArgs e)
        {
            var editor = sender as GridLookUpEdit;

            //处理空值
            if (e.DisplayValue == null || String.IsNullOrWhiteSpace(e.DisplayValue.ToString()) || e.DisplayValue.ToString() == editor.Properties.NullText)
            {
                return;
            }

            //数据源添加一条记录
            var list = editor.Properties.DataSource as List<GoodsItem>;
            list.Add(new GoodsItem { GoodsNo = e.DisplayValue.ToString() });//这里必须是对应DisplayMember字段

            e.Handled = true;
        }

2.2、支持输入包含内容的值

现在有新的问题,当用户录入一个货号是包含关系的新值,结果GridLookUpEdit组件直接忽略,如下图所示:

C# DevExpress高级篇 | GridLookUpEdit组件使用|C/S开发框架

解决方案:

C# 全选
            //按回车键处理包含关系的新值
            rep_Grid.KeyDown += On_GridLookUpEdit_KeyDown;

C# 全选
        /// <summary>
        /// 按回车键保存新录入的内容(自动保存包含关系的内容,如:数据源的字段有ABC值, 录入BC回车,数据源要自动保存BC值)
        /// 注:GridLookUpEdit组件默认不保存新值,如BC值,需要通过KeyDown事件特殊处理!
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void On_GridLookUpEdit_KeyDown(object? sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter) //捕获回车键
            {
                var txt = (sender as GridLookUpEdit).Text; //取录入的值,如:BC

                //数据源添加一条记录
                var list = rep_Grid.DataSource as List<GoodsItem>;
                if (!list.Any(a => a.GoodsNo.ToLower() == txt.ToLower())) //数据源没有该值
                {
                    list.Add(new GoodsItem { GoodsNo = txt });//这里必须是对应DisplayMember字段
                }

                //隐藏下拉表格窗体
                gridView1.HideEditor();

                //单元格设置新录入的值,如:BC
                gridView1.SetFocusedRowCellValue(nameof(GoodsItem.GoodsNo), txt);

                //处理按键操作完成
                e.Handled = true;
            }
        }

2.3、支持获取下拉表格当前行

另一个问题,当【货号】重复时,如下图GXa2货号,无论你选择哪一行,永远返回第1行的资料,如下图绿色框的记录行。

C# DevExpress高级篇 | GridLookUpEdit组件使用|C/S开发框架

解决方案:

C# 全选
//下拉表格的记录行点击事件
rep_Grid.View.RowClick += On_GridLookUpEdit_RowClick;

C# 全选
        /// <summary>
        /// 下拉表格窗体选中一行,自动给当前行赋值
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void On_GridLookUpEdit_RowClick(object sender, RowClickEventArgs e)
        {
            //下拉表格(GridLookUpEdit)当前行
            GridView gv = (sender as GridView);
            GoodsItem item = gv.GetRow(e.RowHandle) as GoodsItem;

            //数据表格当前行
            var row = gridView1.GetFocusedRow() as GoodsItem;
            row.ProductName = item.ProductName;
            row.GoodsNo = item.GoodsNo;

            gridView1.UpdateCurrentRow();

            //事件操作完成
            e.Handled = true;
        }

2.4、设置不接受当前焦点行的值

经过上面的骚操作后,作者发现还有个严重的问题,就是弹出下拉窗体并移动鼠标改变焦点行,此时关闭下拉窗体会给当前单元格自动赋值焦点行的货号。

C# DevExpress高级篇 | GridLookUpEdit组件使用|C/S开发框架

最后,设置不接受当前焦点行的值。避免关闭下拉窗体时自动取下拉窗体焦点行的值。

解决方案:

C# 全选
 rep_Grid.CloseUp += On_GridLookUpEdit_CloseUp;

C# 全选
        private void On_GridLookUpEdit_CloseUp(object sender, CloseUpEventArgs e)
        {
            //设置不接受当前焦点行的值。避免关闭下拉窗体时,自动取下拉窗体焦点行的值
            e.AcceptValue = false;
        }

C/S框架网|原创精神.创造价值.打造精品


扫一扫加作者微信
C/S框架网作者微信 C/S框架网|原创作品.质量保障.竭诚为您服务
上一篇 下一篇