C# DevExpress高级篇 - GridLookUpEdit组件使用
一、前言
作者目前在开发一套大型ERP系统时用到GridLookUpEdit组件,用户有一些特殊要求非常棘手,研究了半天终于整出来了,分享出来给大家。
二、GridLookUpEdit 组件特殊要求
2.1、支持输入新值
如下图所示,用户要求【货号】列能输入新值,当下拉窗体的【货号】不存时要求录入新货号。
要求能录入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# 全选
//按回车键处理包含关系的新值
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# 全选
//下拉表格的记录行点击事件
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# 全选
rep_Grid.CloseUp += On_GridLookUpEdit_CloseUp;
C# 全选
private void On_GridLookUpEdit_CloseUp(object sender, CloseUpEventArgs e)
{
//设置不接受当前焦点行的值。避免关闭下拉窗体时,自动取下拉窗体焦点行的值
e.AcceptValue = false;
}
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc C/S框架网