在实际的项目开发过程中,有好的控件或者功能模块,我都是想办法尽可能集成到我的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. 怎样用UltraISO制作U盘系统安装盘

    http://jingyan.baidu.com/article/d169e186800f02436711d87b.html 如今用u盘装系统成为主流,如何不被社会淘汰.跟我往下边看吧~~ 工具/原料 ...

  2. 随机抽样一致性算法(RANSAC)示例及源代码

    作者:王先荣 大约在两年前翻译了<随机抽样一致性算法RANSAC>,在文章的最后承诺写该算法的C#示例程序.可惜光阴似箭,转眼许久才写出来,实在抱歉.本文将使用随机抽样一致性算法来来检测直 ...

  3. 如何查看 exec sp_execute 10 XXX, XXXX的RPC事件 内容

    使用事件探查器经常能捕捉到类似于exec sp_execute 10 XXX, XXXX的RPC事件. 我想问下从哪里可以看到存储过程sp_execute 10的内容呢?? 方法如下: 在新建的pro ...

  4. Spring3系列13-Controller和@RequestMapping

    Spring3系列13-Controller和@RequestMapping Controller返回值,String或者ModelAndView @RequestMapping关联url @Requ ...

  5. dll return a string

    char g_szText[1024]; __declspec(dllexport) const char * __stdcall FuncName(const unsigned char *p) { ...

  6. 为什么要提倡“Design Pattern呢

    为什么要提倡“Design Pattern呢?根本原因是为了代码复用,增加可维护性. 那么怎么才能实现代码复用呢?面向对象有几个原则:开闭原则(Open Closed Principle,OCP).里 ...

  7. Qt实现FlatUI样式(开源)

    对于现在做前端开发人员来说,FlatUI肯定不陌生,最近几年扁平化的设计越来越流行,大概由于现在PC端和移动端的设备的分辨率越来越高,扁平化反而看起来更让人愉悦,而通过渐变色产生的质感色彩反而没有扁平 ...

  8. C++ Copy Elision

    故事得从 copy/move constructor 说起: The default constructor (12.1), copy constructor and copy assignment ...

  9. SLAM拾萃(3):siftGPU

    前言 本周博客我们给大家介绍一下SiftGPU.由于特征匹配是SLAM中非常耗时间的一步,许多人都想把它的时间降至最短,因此目前ORB成了非常受欢迎的特征.而老牌SIFT,则一直给人一种“很严谨很精确 ...

  10. [原]Android打包之Gradle打包

    最近尝试了一下Android的Gradle打包,发现确实比Ant打包会方便很多,特此记录下来. 注:android的gradle现在插件的版本已经是0.14.3了,对于一些老的方法和api,有一些已经 ...