C#DevExpress使用GridLookUpEdit实现订单明细选择商品

打印 上一主题 下一主题

主题 918|帖子 918|积分 2754

一、功能需求

ERP系统的《客户报价单》、《贩卖订单》,用户在开单时需要快速检索商品历史,下拉选择商品快速开单,提高工作服从及用户体验。
如下图所示:


有两种办理方案:
1、使用LookupEdit,组件比较简单,但效果不佳。
2、使用GridLookupEdit,丰富的下拉表格组件,支持每个列检索数据。
本文采用第2种方案。

二、上硬货

需要使用DevExpress的 RepositoryItemGridLookUpEdit 组件,下面给大家提供完备版源码。
2.1 给GridColumn列绑定 RepositoryItemGridLookUpEdit 组件

选择列,属性标签页ColumnEdit属性,点击右侧的下拉按钮,双击选择GridLookUpEdit组件。

改名,输入新的名称,按回车改名。


现在已完成创建RepositoryItemGridLookUpEdit组件,定名: rep_SelectProduct

2.2 初始化 RepositoryItemGridLookUpEdit 组件 及绑定数据源

我们采用硬编码方式初始化 RepositoryItemGridLookUpEdit 组件,其优点是能直观看到重要属性设置。
  1. /// <summary>
  2. /// 初始化 RepositoryItemGridLookUpEdit 组件
  3. /// </summary>
  4. private void InitGridLookUpEdit_SelectProduct()
  5. {
  6.     GridView view = rep_SelectProduct.View;
  7.     view.Columns.Clear();
  8.     view.Columns.Add(new GridColumn { Caption = "产品编号", FieldName = nameof(tb_SOs.ProductCode), Width = 100, VisibleIndex = 0 });
  9.     view.Columns.Add(new GridColumn { Caption = "品名", FieldName = nameof(tb_SOs.ProductName), Width = 150, VisibleIndex = 1 });
  10.     view.Columns.Add(new GridColumn { Caption = "规格", FieldName = nameof(tb_SOs.Spec), Width = 150, VisibleIndex = 2 });
  11.     view.Columns.Add(new GridColumn { Caption = "配方", FieldName = nameof(tb_SOs.Formula), Width = 60, VisibleIndex = 3 });
  12.     view.Columns.Add(new GridColumn { Caption = "长度", FieldName = nameof(tb_SOs.Length), Width = 60, VisibleIndex = 4 });
  13.     view.Columns.Add(new GridColumn { Caption = "米重", FieldName = nameof(tb_SOs.UnitWeight), Width = 60, VisibleIndex = 5 });
  14.     var width = view.Columns.ToList().Sum(i => i.Width) + 10;
  15.     rep_SelectProduct.AcceptEditorTextAsNewValue = DevExpress.Utils.DefaultBoolean.True; //重要!!!接受文本框的值作为新值显示
  16.     rep_SelectProduct.NullText = "";
  17.     rep_SelectProduct.PopupFormSize = new Size(width, 400);//下拉窗体尺寸
  18.     rep_SelectProduct.View.RowHeight = 22; //行高
  19.     rep_SelectProduct.ImmediatePopup = true;//输入值立即弹出下拉窗体
  20.     rep_SelectProduct.SearchMode = GridLookUpSearchMode.AutoSearch;//设置为自动搜索模式,重要!!!
  21.     rep_SelectProduct.PopupFilterMode = DevExpress.XtraEditors.PopupFilterMode.Contains;//表格筛选列过滤模式
  22.     rep_SelectProduct.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard;//允许录入资料
  23.     rep_SelectProduct.View.OptionsView.ShowAutoFilterRow = true;//下拉表格显示过滤行
  24.     //按回车键处理包含关系的新值
  25.     rep_SelectProduct.ProcessNewValue += this.On_GridLookUpEdit_ProcessNewValue; //在输入框录入新值处理事件
  26.     //按回车键处理包含关系的新值
  27.     rep_SelectProduct.KeyDown += On_GridLookUpEdit_KeyDown;
  28.     //下拉表格的记录行点击事件
  29.     rep_SelectProduct.View.RowClick += On_GridLookUpEdit_RowClick;
  30.     rep_SelectProduct.CloseUp += On_GridLookUpEdit_CloseUp;
  31.     //绑定数据源
  32.     List<dt_Product> list = DataDictCache.Cache.ProductList.Copy();
  33.     rep_SelectProduct.DisplayMember = nameof(tb_SOs.ProductName);
  34.     rep_SelectProduct.ValueMember = nameof(tb_SOs.ProductName);
  35.     rep_SelectProduct.DataSource = list;
  36. }
复制代码

2.3 On_GridLookUpEdit_ProcessNewValue

在单元格录入新值,自动添加到数据源
  1. /// <summary>
  2. /// 在单元格录入新值,自动添加到数据源
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void On_GridLookUpEdit_ProcessNewValue(object sender, ProcessNewValueEventArgs e)
  7. {
  8.     var editor = sender as GridLookUpEdit;
  9.     if (e.DisplayValue.IsEmpty() || e.DisplayValue.ToStringEx() == editor.Properties.NullText)
  10.     {
  11.         return;
  12.     }
  13.     //如果没有绑定数据源,初始化空列表实例
  14.     if (editor.Properties.DataSource == null)
  15.     {
  16.         editor.Properties.DataSource = new List<dt_Product>();
  17.     }
  18.     //给数据源添加一条记录
  19.     var list = editor.Properties.DataSource as List<dt_Product>;
  20.     list.Add(new dt_Product { ProductName = e.DisplayValue.ToStringEx() });
  21.     e.Handled = true;
  22. }
复制代码

2.4 On_GridLookUpEdit_KeyDown

GridLookUpEdit组件回车键变乱,录入的数据不存在,自动添加到数据源
  1. /// <summary>
  2. /// GridLookUpEdit组件回车键事件,录入的数据不存在,自动添加到数据源
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void On_GridLookUpEdit_KeyDown(object sender, KeyEventArgs e)
  7. {
  8.     if (e.KeyCode == Keys.Enter) //捕获回车键
  9.     {
  10.         var txt = (sender as GridLookUpEdit).Text;
  11.         var list = rep_SelectProduct.DataSource as List<dt_Product>;
  12.         if (!list.Any(a => a.ProductName.ToStringEx().ToLower() == txt.ToLower())) //数据源没有该值
  13.         {
  14.             list.Add(new dt_Product { ProductName = txt });//这里必须是对应DisplayMember字段
  15.         }
  16.         gvDetail.HideEditor();
  17.         gvDetail.SetFocusedRowCellValue(nameof(dt_Product.ProductName), txt);
  18.         e.Handled = true;
  19.     }
  20. }
复制代码

2.5 On_GridLookUpEdit_RowClick

选择一条记录,触发表格的点击变乱
  1. /// <summary>
  2. /// 选择一条记录,触发表格的点击事件
  3. /// </summary>
  4. /// <param name="sender"></param>
  5. /// <param name="e"></param>
  6. private void On_GridLookUpEdit_RowClick(object sender, RowClickEventArgs e)
  7. {
  8.     GridView gv = (sender as GridView);
  9.     dt_Product product = gv.GetRow(e.RowHandle) as dt_Product; //下拉窗体当前选择行
  10.     res_SOs row = gvDetail.GetRow<res_SOs>();//明细表当前行
  11.     SetRowProductInfo(row, product);//赋值
  12.     gvDetail.HideEditor();
  13.     e.Handled = true;
  14. }
复制代码


2.6 SetRowProductInfo

给贩卖订单明细记录设置产品资料
  1. /// <summary>
  2. /// 给销售订单明细记录设置产品资料
  3. /// </summary>
  4. /// <param name="row"></param>
  5. /// <param name="product"></param>
  6. void SetRowProductInfo(res_SOs row, dt_Product product)
  7. {
  8.     row.ProductCode = product.ProductCode;
  9.     row.ProductName = product.ProductName;
  10.     row.ProductType = product.ProductType;
  11.     row.CategoryId = product.CategoryId;//品类
  12.     row.Price = product.SellPrice;//吨价
  13.     row.Spec = product.Spec;
  14.     row.Unit = product.UnitID;
  15.     row.Formula = product.Formula;
  16.     row.Length = product.Length;
  17.     row.UnitWeight = product.Weight;//米重
  18. }
复制代码

2.7 Form.Load变乱调用


  1. private void frmSO_Load(object sender, EventArgs e)
  2. {               
  3.     this.InitGridLookUpEdit_SelectProduct();
  4. }
复制代码


三、测试效果

自动筛选数据


选择一条记录



录入新品名




本教程《贩卖订单》界面,使用 CSFrameworkV6.1旗舰版 快速开发框架为客户定制的板材行业ERP系统。
以后会分享更多硬货给大家~ 感谢您的关注!
专注.NET技能、C/S架构开发框架软件
C/S框架网 - 开发框架文库


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表