在Winform开发框架中,利用DevExpress控件实现数据的快速录入和选择
在实际的项目开发过程中,有好的控件或者功能模块,我都是想办法尽可能集成到我的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控件实现数据的快速录入和选择的更多相关文章
- 关于WinForm引用WPF窗体---在Winform窗体中使用WPF控件
项目中有个界面展示用WPF实现起来比较简单,并且能提供更酷炫的效果,但是在WinForm中使用WPF窗体出现了问题,在网上找了一下有些人说Winform不能引用WPF的窗体,我就很纳闷,Win32都能 ...
- C# winform编程中多线程操作控件方法
private void Form1_Load(object sender, EventArgs e) { Thread newthread = new Thread(new ThreadStart( ...
- 在Winform窗体中使用WPF控件(附源码)
原文:在Winform窗体中使用WPF控件(附源码) 今天是礼拜6,下雨,没有外出,闲暇就写一篇博文讲下如何在Winform中使用WPF控件.原有是我在百度上搜索相关信息无果,遂干脆动手自己实现. W ...
- WinForm开发中针对TreeView控件改变当前选择节点的字体与颜色
本文转载:http://www.cnblogs.com/umplatform/archive/2012/08/29/2660240.html 在B/S开发中,对TreeView控件要改变当前选中节点的 ...
- C#里WinForm开发中如何实现控件随窗体大小的改变而自动适应其改变(转)
在设计可供用户调整大小的窗体时,如何实现该窗体上的控件也应能正确地随窗体的改变而自动调整大小并且能重新定位?此时就要借助控件的.Anchor属性.Anchor属性定义控件的定位点位置.当控件锚定到某个 ...
- VS工具箱中添加DevExpress控件
关闭所有VS进程: ①使用控制台进入DevExpress安装目录: D:\DevExpress\Components\Tools\ ②添加DevExpress控件:ToolboxCreator.exe ...
- 在Winform开发框架中使用DevExpress的TreeList和TreeListLookupEdit控件
DevExpress提供的树形列表控件TreeList和树形下拉列表控件TreeListLookupEdit都是非常强大的一个控件,它和我们传统Winform的TreeView控件使用上有所不同,我一 ...
- 在Winform开发框架中使用DevExpress的内置图标资源
在开发Winform程序界面的时候,我们往往会使用一些较好看的图表,以便能够为我们的程序界面增色,良好的图标设置可以让界面看起来更加美观舒服,而且也比较容易理解,图标我们可以通过一些网站获取各种场景的 ...
- C# WinForm程序中使用Unity3D控件 (转)
https://www.cnblogs.com/cnxkey/articles/5394378.html 最近在自学Unity3D,打算使用这个时髦.流行.强大的游戏引擎开发一个三维业务展示系统,不过 ...
随机推荐
- Python的列表推导式
1.列表推导式书写形式: [表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件] 2.举例说明: #!/usr/bin/python # -*- codi ...
- phpStorm无法使用svn1.8的解决办法
1.安装SVN的Command Lines Tools. 2.在phpStorm的SVN属性中,将Use Command Line Client填入:C:\Program Files\Tortoise ...
- Android 5.0 Default SMS App以及运营商授权SMS App
已同步更新至个人blog:http://dxjia.cn/2015/08/android-5-default-sms-app/ 题外话:博友们有没有好用的写博客客户端推荐啊,cnblogs推荐的win ...
- 修改eclipse启动时eclipse使用的jre
eclipse在启动的时候,和环境变量中的jdk不兼容,可以单独制定eclipse运行的jre. 方法: 在eclipse的配置文件里增加-vm参数即可. 打开eclipse目录下的eclipse.i ...
- SQL SERVER 移动系统数据库
移动系统数据库在下列情况下可能很有用: 故障恢复.例如,数据库处于可疑模式下或因硬件故障而关闭. 计划的重定位. 为预定的磁盘维护操作而进行的重定位. 移动 Master 数据库 在“开始”菜 ...
- Spring3系列2 -- 松耦合的实现
Spring3系列2 -- 松耦合的实现 一. 环境 spring-framework-3.2.4.RELEASE jdk1.7.0_11 Maven3.0.5 eclipse-jee-ju ...
- Promising Linking
Future/Promise 执行逻辑 scala Future 有几个要点,第一个是 tryAwait 需要借助 CowndownLatch 实现,第二个是可以在 Promise 挂载回调函数 首先 ...
- 解决Spring+Quartz无法自动注入bean问题
问题 我们有时需要执行一些定时任务(如数据批处理),比较常用的技术框架有Spring + Quartz中.无奈此方式有个问题:Spring Bean无法自动注入. 环境:Spring3.2.2 + Q ...
- 牢骚与javascript中的this
最近在看关于拖延症的一本书<拖拉一点也无妨>,后面得出结论是自己写博客大部分处于两种状态,心情很好和心情很不好的时候.因为正常状态下感觉写博客吧,是件很麻烦的事情,不如去看看电影看看漫画啥 ...
- mono+jexus 验证码不显示:System.Drawing
System.ArgumentException The requested FontFamily could not be found [GDI+ status: FontFamilyNotFoun ...