在实际的项目开发过程中,有好的控件或者功能模块,我都是想办法尽可能集成到我的WInform开发框架中,这样后面开发项目起来,就可以节省很多研究时间,并能重复使用,非常高效方便。在我很早之前的一篇博客《在GridControl控件中使用SearchLookUpEdit构建数据快速输入》就曾经介绍,如何在列表控件中实现数据的快速录入,本文介绍另外一种方式,通过文本输入框的输入选择,可以实现数据的快速录入,原理和之前一篇差不多,不过这次利用DevExpress控件的GridLookupEdit控件封装类进行数据的处理。
首先我们来回顾一下,GridControl列表控件中如何实现数据的快速录入的。一般情况下,在我的框架都是利用弹出窗体进行标准数据的录入,这样的情况比较通用,但是对于一些想实现数据在列表中快速录入,可能就不一定符合他们的使用习惯,客户要求往往是第一位,如果有这样的要求,我们一定要想办法满足。
一个实际的案例就是门诊的时候,医生用药的情况,除了选择其他内容外,主要的就是快速录入药品信息。我们平常去大一点 的医院看病,好像看到的多数操作都是这样。还有一种方式就是销售人员提供的报价单,从产品里面选择信息,然后修改下价格,这些场景都是很适合这样的操作的。下面是一个门诊的例子。
1)原有系统控件实现的界面效果
很多时候,我们可能需要在编辑框里面快速录入数据,如果是纯粹的选择列表项目,那么可以选择GridLookupEdit或者SearchLookupEdit控件,这两个控件都是可以实现快速的选择的,如下DevExpress例子的界面所示。
GridLookupEdit例子效果:
SearchLookupEdit例子效果:
2)Winform开发框架中封装的GridLookupEdit控件的输入效果
上面两个不同的例子,他们弹出一个新的列表框操作都差不多的,不同的是SearchLookupEdit控件会有一个可以查找的输入框,实现数据的过滤查找。
使用GridLookupEdit控件,可以把输入框的属性TextEditStyle修改为修改为TextEditStyles.Standard,如果要封装用来可以允许输入新的内容,记得要处理ProcessNewValue函数,默认GridLookupEdit控件不允许输入列表中不存在的内容,也就是只能选择列表的内容。
但是,我们项目很多时候,需要一个可以录入,也可以从列表中选择数据的场景,最好能够结合拼音码实现数据的快速录入,如下界面所示。
当我们输入中文的时候,会自动从列表中进行数据的过滤,如下所示。
当我们输入拼音简码的时候,也可以实现一样的效果,如下所示。
当然,如果列表里面没有相应的数据的时候,我们可以输入新的内容(注意:默认的GridLookupEdit是不允许输入新内容的)。
这样在内容很多的时候,就可以实现数据的快速选择或者录入新的数据了。
例如我的《医院科室数据管理系统》软件产品里面,就需要从大量的入院诊断或者出院诊断中选择或者输入新的诊断,上面的控件效果就是我所需要的。
当然,以上只是框架功能模块的沧海一栗,很多重要的功能并不在该文中介绍,具体可以了解这个框架设计图,或者查看《 Winform开发框架的标签内容》
Winform开发框架的主要功能概览如下图所示。
这个功能模块的重要实现就是要重新封装GridLookupEdit控件,并设置其一些默认属性,还需要处理前面所说过的,处理该对象的ProcessNewValue的事件处理,部分代码如下所示。
/// <summary> /// 自定义的GridLookUpEdit控件 /// </summary> public class CustomGridLookUpEdit : GridLookUpEdit { /// <summary> /// 是否禁止新增内容 /// </summary> [Browsable(true), Description("是否禁止新增内容")] public bool DisableAddNew { get; set; } static CustomGridLookUpEdit() { RepositoryItemCustomGridLookUpEdit.RegisterCustomGridLookUpEdit(); } public CustomGridLookUpEdit() : base() { //初始化一些状态 this.Properties.PopupFilterMode = PopupFilterMode.Contains;//包含即可 this.Properties.ImmediatePopup = true;//是否马上弹出窗体 this.Properties.ValidateOnEnterKey = true;//回车确认 this.Properties.TextEditStyle = DevExpress.XtraEditors.Controls.TextEditStyles.Standard;//文本框可输入 this.Properties.NullText = ""; this.Properties.NullValuePrompt = ""; this.ProcessNewValue += new DevExpress.XtraEditors.Controls.ProcessNewValueEventHandler(CustomGridLookUpEdit_ProcessNewValue); } /// <summary> /// 实现在列表没有记录的时候,可以录入一个不存在的记录,类似ComoboEidt功能 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void CustomGridLookUpEdit_ProcessNewValue(object sender, DevExpress.XtraEditors.Controls.ProcessNewValueEventArgs e) { if (!DisableAddNew && !this.DesignMode) { string displayName = this.Properties.DisplayMember; string valueName = this.Properties.ValueMember; string display = e.DisplayValue.ToString(); DataTable dtTemp = this.Properties.DataSource as DataTable; if (dtTemp != null) { DataRow[] selectedRows = dtTemp.Select(string.Format("{0}='{1}'", displayName, display.Replace("'", "‘"))); if (selectedRows == null || selectedRows.Length == 0) { DataRow row = dtTemp.NewRow(); row[displayName] = display; row[valueName] = display; dtTemp.Rows.Add(row); dtTemp.AcceptChanges(); } } e.Handled = true; } }
在调用的时候,我们需要绑定相应的数据,并且给它增加一个拼音码的列,方便通过拼音码来实现快速检索,使用代码如下所示(这里通过扩展方法的方式实现数据的绑定)。
/// <summary> /// 绑定下拉列表控件为指定的数据字典列表 /// </summary> /// <param name="combo">下拉列表控件</param> /// <param name="dictTypeName">数据字典类型名称</param> /// <param name="defaultValue">控件默认值</param> public static void BindDictItems(this CustomGridLookUpEdit combo, string dictTypeName, string defaultValue) { string displayName = dictTypeName; const string valueName = "值内容"; const string pinyin = "拼音码"; DataTable dt = DataTableHelper.CreateTable(string.Format("{0},{1},{2}", displayName, valueName, pinyin)); Dictionary<string, string> dict = BLLFactory<DictData>.Instance.GetDictByDictType(dictTypeName); foreach (string key in dict.Keys) { DataRow row = dt.NewRow(); row[displayName] = key; row[valueName] = dict[key]; row[pinyin] = Pinyin.GetFirstPY(key); dt.Rows.Add(row); } combo.Properties.ValueMember = valueName; combo.Properties.DisplayMember = displayName; combo.Properties.DataSource = dt; combo.Properties.PopulateViewColumns(); combo.Properties.View.Columns[valueName].Visible = false; combo.Properties.View.Columns[displayName].Width = 400; combo.Properties.View.Columns[pinyin].Width = 200; combo.Properties.PopupFormMinSize = new System.Drawing.Size(600, 0); if (!string.IsNullOrEmpty(defaultValue)) { combo.EditValue = defaultValue; } }
调用代码只需要调用该方法即可。
txtInDiagnosis.BindDictItems("入院诊断");
以上就是我对于这种利用DevExpress控件实现数据的快速录入和选择操作的功能演示和实际代码逻辑展示,希望对大家有所帮助。