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

news/2025/2/25 3:03:12/

一、功能需求

ERP系统的《客户报价单》、《销售订单》,用户在开单时需要快速检索商品历史,下拉选择商品快速开单,提高工作效率及用户体验。

如下图所示:

Winform+DevExpress实现订单明细选择商品,并自动添加新商品记录

有两种解决方案:

1、使用LookupEdit,组件比较简单,但效果不佳。

2、使用GridLookupEdit,丰富的下拉表格组件,支持每个列检索数据。

本文采用第2种方案。

二、上硬货

需要使用DevExpress的 RepositoryItemGridLookUpEdit 组件,下面给大家提供完整版源码。

2.1 给GridColumn列绑定 RepositoryItemGridLookUpEdit 组件

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

Winform+DevExpress实现订单明细选择商品,并自动添加新商品记录

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

Winform+DevExpress实现订单明细选择商品,并自动添加新商品记录

目前已完成创建RepositoryItemGridLookUpEdit组件,命名: rep_SelectProduct

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

我们采用硬编码方式初始化 RepositoryItemGridLookUpEdit 组件,其优点是能直观看到重要属性设置。

/// <summary>
/// 初始化 RepositoryItemGridLookUpEdit 组件
/// </summary>
private void InitGridLookUpEdit_SelectProduct()
{GridView view = rep_SelectProduct.View;view.Columns.Clear();view.Columns.Add(new GridColumn { Caption = "产品编号", FieldName = nameof(tb_SOs.ProductCode), Width = 100, VisibleIndex = 0 });view.Columns.Add(new GridColumn { Caption = "品名", FieldName = nameof(tb_SOs.ProductName), Width = 150, VisibleIndex = 1 });view.Columns.Add(new GridColumn { Caption = "规格", FieldName = nameof(tb_SOs.Spec), Width = 150, VisibleIndex = 2 });view.Columns.Add(new GridColumn { Caption = "配方", FieldName = nameof(tb_SOs.Formula), Width = 60, VisibleIndex = 3 });view.Columns.Add(new GridColumn { Caption = "长度", FieldName = nameof(tb_SOs.Length), Width = 60, VisibleIndex = 4 });view.Columns.Add(new GridColumn { Caption = "米重", FieldName = nameof(tb_SOs.UnitWeight), Width = 60, VisibleIndex = 5 });var width = view.Columns.ToList().Sum(i => i.Width) + 10;rep_SelectProduct.AcceptEditorTextAsNewValue = DevExpress.Utils.DefaultBoolean.True; //重要!!!接受文本框的值作为新值显示rep_SelectProduct.NullText = "";rep_SelectProduct.PopupFormSize = new Size(width, 400);//下拉窗体尺寸rep_SelectProduct.View.RowHeight = 22; //行高rep_SelectProduct.ImmediatePopup = true;//输入值立即弹出下拉窗体rep_SelectProduct.SearchMode = GridLookUpSearchMode.AutoSearch;//设置为自动搜索模式,重要!!!rep_SelectProduct.PopupFilterMode = DevExpress.XtraEditors.PopupFilterMode.Contains;//表格筛选列过滤模式rep_SelectProduct.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard;//允许录入资料rep_SelectProduct.View.OptionsView.ShowAutoFilterRow = true;//下拉表格显示过滤行//按回车键处理包含关系的新值rep_SelectProduct.ProcessNewValue += this.On_GridLookUpEdit_ProcessNewValue; //在输入框录入新值处理事件//按回车键处理包含关系的新值rep_SelectProduct.KeyDown += On_GridLookUpEdit_KeyDown;//下拉表格的记录行点击事件rep_SelectProduct.View.RowClick += On_GridLookUpEdit_RowClick;rep_SelectProduct.CloseUp += On_GridLookUpEdit_CloseUp;//绑定数据源List<dt_Product> list = DataDictCache.Cache.ProductList.Copy();rep_SelectProduct.DisplayMember = nameof(tb_SOs.ProductName);rep_SelectProduct.ValueMember = nameof(tb_SOs.ProductName);rep_SelectProduct.DataSource = list;
}

2.3 On_GridLookUpEdit_ProcessNewValue

在单元格录入新值,自动添加到数据源

/// <summary>
/// 在单元格录入新值,自动添加到数据源
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void On_GridLookUpEdit_ProcessNewValue(object sender, ProcessNewValueEventArgs e)
{var editor = sender as GridLookUpEdit;if (e.DisplayValue.IsEmpty() || e.DisplayValue.ToStringEx() == editor.Properties.NullText){return;}//如果没有绑定数据源,初始化空列表实例if (editor.Properties.DataSource == null){editor.Properties.DataSource = new List<dt_Product>();}//给数据源添加一条记录var list = editor.Properties.DataSource as List<dt_Product>;list.Add(new dt_Product { ProductName = e.DisplayValue.ToStringEx() });e.Handled = true;
}

2.4 On_GridLookUpEdit_KeyDown

GridLookUpEdit组件回车键事件,录入的数据不存在,自动添加到数据源

/// <summary>
/// GridLookUpEdit组件回车键事件,录入的数据不存在,自动添加到数据源
/// </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;var list = rep_SelectProduct.DataSource as List<dt_Product>;if (!list.Any(a => a.ProductName.ToStringEx().ToLower() == txt.ToLower())) //数据源没有该值{list.Add(new dt_Product { ProductName = txt });//这里必须是对应DisplayMember字段}gvDetail.HideEditor();gvDetail.SetFocusedRowCellValue(nameof(dt_Product.ProductName), txt);e.Handled = true;}
}

2.5 On_GridLookUpEdit_RowClick

选择一条记录,触发表格的点击事件

/// <summary>
/// 选择一条记录,触发表格的点击事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void On_GridLookUpEdit_RowClick(object sender, RowClickEventArgs e)
{GridView gv = (sender as GridView);dt_Product product = gv.GetRow(e.RowHandle) as dt_Product; //下拉窗体当前选择行res_SOs row = gvDetail.GetRow<res_SOs>();//明细表当前行SetRowProductInfo(row, product);//赋值gvDetail.HideEditor();e.Handled = true;
}

2.6 SetRowProductInfo

给销售订单明细记录设置产品资料

/// <summary>
/// 给销售订单明细记录设置产品资料
/// </summary>
/// <param name="row"></param>
/// <param name="product"></param>
void SetRowProductInfo(res_SOs row, dt_Product product)
{row.ProductCode = product.ProductCode;row.ProductName = product.ProductName;row.ProductType = product.ProductType;row.CategoryId = product.CategoryId;//品类row.Price = product.SellPrice;//吨价row.Spec = product.Spec;row.Unit = product.UnitID;row.Formula = product.Formula;row.Length = product.Length;row.UnitWeight = product.Weight;//米重
}

2.7 Form.Load事件调用

private void frmSO_Load(object sender, EventArgs e)
{               this.InitGridLookUpEdit_SelectProduct();
}

三、测试效果

自动筛选数据

Winform+DevExpress使用GridLookUpEdit实现订单明细选择商品,并自动添加新商品记录

选择一条记录

Winform+DevExpress使用GridLookUpEdit实现订单明细选择商品,并自动添加新商品记录

录入新品名

Winform+DevExpress使用GridLookUpEdit实现订单明细选择商品,并自动添加新商品记录

本教程《销售订单》界面,使用 CSFrameworkV6.1旗舰版 快速开发框架为客户定制的板材行业ERP系统。

以后会分享更多硬货给大家~ 感谢您的关注!

专注.NET技术、C/S架构开发框架软件

C/S框架网 - 开发框架文库

footer页脚文章脚图片-唯快不破-开发框架文库


http://www.ppmy.cn/news/1574751.html

相关文章

【Quest开发】全身跟踪(一)

软件&#xff1a;Unity 2022.3.51f1c1、vscode、Meta XR All in One SDK V72 硬件&#xff1a;Meta Quest3 最终效果&#xff1a;能像meta的操作室沉浸场景一样根据头盔移动来推断用户姿势&#xff0c;实现走路、蹲下、手势匹配等功能 需要借助UnityMovement这个包 GitHub …

算法常见八股问题整理

1.极大似然估计和交叉熵有什么关系 在分类问题中&#xff0c;当我们使用softmax函数作为输出层时&#xff0c;最大化对数似然函数实际上等价于最小化交叉熵损失函数。具体来说&#xff0c;在多分类情况下&#xff0c;最大化该样本的对数似然等价于最小化该样本的交叉熵损失。 交…

一周学会Flask3 Python Web开发-客户端状态信息Cookie以及加密

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili HTTP是无状态&#xff08;stateless)协议。也就是说&#xff0c;在一次请求响应结束后&#xff0c;服务器不会留下任何关于对…

设计模式-observer模式(观察者模式)

解释 观察者模式用于建立对象间的一对多依赖&#xff0c;当主题&#xff08;Subject&#xff09;状态变化时&#xff0c;所有观察者&#xff08;Observers&#xff09;自动收到通知。 Observer 模式应该可以说是应用最多、影响最广的模式之一&#xff0c;因为 Observer 的一个…

PHP集成软件用哪个比较好?

在Windows环境下&#xff0c;使用PHP时&#xff0c;通常需要一个集成开发环境&#xff08;IDE&#xff09;或者集成软件来简化开发和调试过程。以下是几款常用且推荐的PHP集成软件&#xff0c;每款都有其特点&#xff0c;可以根据需求进行选择&#xff1a; 1. XAMPP 特点&…

【DeepSeek 行业赋能】从金融到医疗:探索 DeepSeek 在垂直领域的无限潜力

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

蓝桥杯 Java B 组 之堆的基础(优先队列实现 Top K 问题)

Day 6&#xff1a;堆的基础&#xff08;优先队列实现 Top K 问题&#xff09; &#x1f4d6; 一、什么是堆&#xff08;Heap&#xff09;&#xff1f; 堆&#xff08;Heap&#xff09; 是一种特殊的二叉树结构&#xff0c;满足&#xff1a; 最大堆&#xff08;Max Heap&#…

智联招聘爬虫

使用Python和Selenium进行招聘信息爬取 在当今数字化时代&#xff0c;数据已成为企业决策的重要依据。对于人力资源部门或求职者而言&#xff0c;获取最新的招聘信息至关重要。然而&#xff0c;手动浏览和收集招聘信息不仅耗时费力&#xff0c;而且效率低下。为了解决这个问题&…