在实际的项目开发过程中,有好的控件或者功能模块,我都是想办法尽可能集成到我的WInform开发框架中,这样后面开发项目起来,就可以节省很多研究时间,并能重复使用,非常高效方便。在我很早之前的一篇博客《在GridControl控件中使用SearchLookUpEdit构建数据快速输入》就曾经介绍,如何在列表控件中实现数据的快速录入,本文介绍另外一种方式,通过文本输入框的输入选择,可以实现数据的快速录入,原理和之前一篇差不多,不过这次利用DevExpress控件的GridLookupEdit控件封装类进行数据的处理。

1、GridControl集成SearchLookUpEdit的效果展现

首先我们来回顾一下,GridControl列表控件中如何实现数据的快速录入的。一般情况下,在我的框架都是利用弹出窗体进行标准数据的录入,这样的情况比较通用,但是对于一些想实现数据在列表中快速录入,可能就不一定符合他们的使用习惯,客户要求往往是第一位,如果有这样的要求,我们一定要想办法满足。

一个实际的案例就是门诊的时候,医生用药的情况,除了选择其他内容外,主要的就是快速录入药品信息。我们平常去大一点 的医院看病,好像看到的多数操作都是这样。还有一种方式就是销售人员提供的报价单,从产品里面选择信息,然后修改下价格,这些场景都是很适合这样的操作的。下面是一个门诊的例子。

2、在文本输入控件中实现数据的快速录入或选择

1)原有系统控件实现的界面效果

很多时候,我们可能需要在编辑框里面快速录入数据,如果是纯粹的选择列表项目,那么可以选择GridLookupEdit或者SearchLookupEdit控件,这两个控件都是可以实现快速的选择的,如下DevExpress例子的界面所示。

GridLookupEdit例子效果:

SearchLookupEdit例子效果:

2)Winform开发框架中封装的GridLookupEdit控件的输入效果

上面两个不同的例子,他们弹出一个新的列表框操作都差不多的,不同的是SearchLookupEdit控件会有一个可以查找的输入框,实现数据的过滤查找。

使用GridLookupEdit控件,可以把输入框的属性TextEditStyle修改为修改为TextEditStyles.Standard,如果要封装用来可以允许输入新的内容,记得要处理ProcessNewValue函数,默认GridLookupEdit控件不允许输入列表中不存在的内容,也就是只能选择列表的内容。

但是,我们项目很多时候,需要一个可以录入,也可以从列表中选择数据的场景,最好能够结合拼音码实现数据的快速录入,如下界面所示。

当我们输入中文的时候,会自动从列表中进行数据的过滤,如下所示。

当我们输入拼音简码的时候,也可以实现一样的效果,如下所示。

当然,如果列表里面没有相应的数据的时候,我们可以输入新的内容(注意:默认的GridLookupEdit是不允许输入新内容的)。

这样在内容很多的时候,就可以实现数据的快速选择或者录入新的数据了。

例如我的《医院科室数据管理系统》软件产品里面,就需要从大量的入院诊断或者出院诊断中选择或者输入新的诊断,上面的控件效果就是我所需要的。

当然,以上只是框架功能模块的沧海一栗,很多重要的功能并不在该文中介绍,具体可以了解这个框架设计图,或者查看《 Winform开发框架的标签内容》

Winform开发框架的主要功能概览如下图所示。

3、在文本输入控件中实现数据的快速录入的代码实现

这个功能模块的重要实现就是要重新封装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 == )
{
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 = ;
combo.Properties.View.Columns[pinyin].Width = ;
combo.Properties.PopupFormMinSize = new System.Drawing.Size(, ); if (!string.IsNullOrEmpty(defaultValue))
{
combo.EditValue = defaultValue;
}
}

调用代码只需要调用该方法即可。

txtInDiagnosis.BindDictItems("入院诊断");

以上就是我对于这种利用DevExpress控件实现数据的快速录入和选择操作的功能演示和实际代码逻辑展示,希望对大家有所帮助。

在Winform开发框架中,利用DevExpress控件实现数据的快速录入和选择的更多相关文章

  1. 关于WinForm引用WPF窗体---在Winform窗体中使用WPF控件

    项目中有个界面展示用WPF实现起来比较简单,并且能提供更酷炫的效果,但是在WinForm中使用WPF窗体出现了问题,在网上找了一下有些人说Winform不能引用WPF的窗体,我就很纳闷,Win32都能 ...

  2. C# winform编程中多线程操作控件方法

    private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...

  3. 在Winform窗体中使用WPF控件(附源码)

    原文:在Winform窗体中使用WPF控件(附源码) 今天是礼拜6,下雨,没有外出,闲暇就写一篇博文讲下如何在Winform中使用WPF控件.原有是我在百度上搜索相关信息无果,遂干脆动手自己实现. W ...

  4. WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色

    本文转载:http://www.cnblogs.com/umplatform/archive/2012/08/29/2660240.html 在B/S开发中,对TreeView控件要改变当前选中节点的 ...

  5. C#里WinForm开发中如何实现控件随窗体大小的改变而自动适应其改变(转)

    在设计可供用户调整大小的窗体时,如何实现该窗体上的控件也应能正确地随窗体的改变而自动调整大小并且能重新定位?此时就要借助控件的.Anchor属性.Anchor属性定义控件的定位点位置.当控件锚定到某个 ...

  6. VS工具箱中添加DevExpress控件

    关闭所有VS进程: ①使用控制台进入DevExpress安装目录: D:\DevExpress\Components\Tools\ ②添加DevExpress控件:ToolboxCreator.exe ...

  7. 在Winform开发框架中使用DevExpress的TreeList和TreeListLookupEdit控件

    DevExpress提供的树形列表控件TreeList和树形下拉列表控件TreeListLookupEdit都是非常强大的一个控件,它和我们传统Winform的TreeView控件使用上有所不同,我一 ...

  8. 在Winform开发框架中使用DevExpress的内置图标资源

    在开发Winform程序界面的时候,我们往往会使用一些较好看的图表,以便能够为我们的程序界面增色,良好的图标设置可以让界面看起来更加美观舒服,而且也比较容易理解,图标我们可以通过一些网站获取各种场景的 ...

  9. C# WinForm程序中使用Unity3D控件 (转)

    https://www.cnblogs.com/cnxkey/articles/5394378.html 最近在自学Unity3D,打算使用这个时髦.流行.强大的游戏引擎开发一个三维业务展示系统,不过 ...

随机推荐

  1. jqPlot插件绘制柱状图

    每天都在这里看别人写的东西,确发现自己好久没写文章了,可能是因为确实很忙,或许这也是在给自己找的一种借口. 不过这也是我人生中加入得第一个创业公司,来到这里才知道创业公司其实真的很辛苦,产品的萌芽才开 ...

  2. [CoreOS 转载] CoreOS实践指南(六):分布式数据存储Etcd(下)

    转载:http://www.csdn.net/article/2015-01-28/2823739/2 摘要:Etcd是CoreOS生态系统中处于连接各个节点通信和支撑集群服务协同运作的核心地位的模块 ...

  3. JavaScriptSerializer 中的匿名类型 转json

    二:JavaScriptSerializer 中的匿名类型 这个类型我想大家都清楚,不过性能更高的方式应该是用JsonConvert吧,但这个不是本篇讨论的话题,我们重点来看看匿名类型的Json序列化 ...

  4. Hive Streaming 追加 ORC 文件

    1.概述 在存储业务数据的时候,随着业务的增长,Hive 表存储在 HDFS 的上的数据会随时间的增加而增加,而以 Text 文本格式存储在 HDFS 上,所消耗的容量资源巨大.那么,我们需要有一种方 ...

  5. Spring4 MVC Hibernate4集成 Annotation

    Spring4 MVC Hibernate4集成 Annotation 一.本文所用环境 二.工程目录 三.Maven添加依赖 四.新建数据库表 五.配置文件 六.Model层 七.DAO层 八.Se ...

  6. Sql Server:不允许 ASSIGNMENT 语句中包含 FOR XML 子句

    编写函数的时候遇到“不允许 ASSIGNMENT 语句中包含 FOR XML 子句”错误,开始以为数据库函数里不可以写 FOR XML 子句,仔细看了看总觉得这么写别扭索性改了一种写法就通过了. BE ...

  7. Unitils集成DBUnit的问题-解决方案

    Unitils在集成DBunit时,如果数据库是mysql时,就会出现一些如下: org.unitils.core.UnitilsException: Error inserting test dat ...

  8. wireshark解密本地https流量笔记

    此方式支持firefox,chrome 建立path变量 SSLKEYLOGFILE=c:\ssl.key 重启firefox chrome,访问https网站会自动生成ssl session key ...

  9. 二十六、【开源框架】EFW框架Winform前端开发之Grid++Report报表、条形码、Excel导出、图表控件

    回<[开源]EFW框架系列文章索引>        EFW框架源代码下载V1.2:http://pan.baidu.com/s/1hcnuA EFW框架实例源代码下载:http://pan ...

  10. Virgo Tomcat Server 指南-Hello World

    Eclipse发布了最新的Virgo Tomccat Server.VTS是一个应用服务器与OSGi紧密结合并且可以开发bundles形式的Spring web apps应用,他们同样拥有OSGi和S ...