本文版权归博主  惊梦无痕  所有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作。SourceLink

前两天分享了GridControl的自定义编辑器,今天再来分享一下整理出来的GridLookUpEdit的自定义编辑器。
本代码用的DevExpress版本号:17.2.6.0,旧的版本可能有些地方会有些微的变化。
该自定义编辑器需要用到上篇中定义的MyGridView(具体代码可在自定义GridControl编辑器一文中阅览),此控件包含了多列模糊查询功能,希望对使用或正在学习DevExpress的同学有所帮助。
后续有时间会陆续将一些比较实用的自定义编辑器分享出来。

 using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
using Comteck.Dto;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraEditors.Drawing;
using DevExpress.XtraEditors.Popup;
using DevExpress.XtraEditors.Registrator;
using DevExpress.XtraEditors.Repository;
using DevExpress.XtraEditors.ViewInfo;
using DevExpress.XtraGrid;
using DevExpress.XtraGrid.Views.Base; namespace Comteck.Winforms.Controls {
/// <summary>
/// 自定义的GridLookupEdit,允许进行多列的匹配
/// <para>参照:https://www.devexpress.com/Support/Center/Example/Details/E1985 </para>
/// </summary>
[ToolboxItem(true)]
public class MyGridLookUpEdit : GridLookUpEdit {
/// <summary>
/// 自动注册下拉框编辑器
/// </summary>
static MyGridLookUpEdit() {
RepositoryItemMyGridLookUpEdit.RegisterCustomGridLookUpEdit();
} /// <summary>
/// 创建自定义GridLookupEdit
/// </summary>
public MyGridLookUpEdit() : base() {
Initialize();
} /// <summary>
/// 初始化
/// </summary>
private void Initialize() {
this.Tag = false; // 设置全选标记
this.Properties.AllowMouseWheel = false;
//this.EnterMoveNextControl = true;
this.Properties.ImmediatePopup = true;
this.Properties.TextEditStyle = TextEditStyles.Standard; #region 编辑框默认自动全选 // 鼠标移入文本编辑框触发事件
this.Enter += (sender, e) => {
// 设置全选标记
this.Tag = true;
this.SelectAll();
};
// 获取输入焦点时自动全选
this.MouseUp += (sender, e) => {
// 如果鼠标左键操作并且标记存在,则执行全选
if (e.Button == MouseButtons.Left && (bool)this.Tag) {
this.SelectAll();
} // 取消全选标记
this.Tag = false;
};
// 双击输入框时自动全选
this.DoubleClick += (sender, e) => {
this.SelectAll();
}; #endregion this.KeyDown += this.MyGridLookUpEdit_KeyDown;
} /// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MyGridLookUpEdit_KeyDown(object sender, KeyEventArgs e) {
if (e.KeyCode == Keys.Delete) {
var control = sender as BaseEdit;
if (control.ReadOnly) { return; }
control.EditValue = null;
e.Handled = true;
} else if (e.KeyCode == Keys.Down) {
this.ShowPopup(); e.Handled = true;
} else if (e.KeyCode == Keys.Back) {
if (this.IsPopupOpen == false) {
this.ShowPopup(); e.Handled = true;
}
}
} /// <summary>
/// 自定义编辑器名称
/// </summary>
public override string EditorTypeName => RepositoryItemMyGridLookUpEdit.MyGridLookUpEditName; /// <summary>
/// 重写下拉框编辑器
/// </summary>
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public new RepositoryItemMyGridLookUpEdit Properties => base.Properties as RepositoryItemMyGridLookUpEdit; //
// 摘要:
// Gets or sets whether focus is moved to the next control (according to the tab
// order) when an end-user presses ENTER.
[DefaultValue(true)]
[DXCategory("Behavior")]
public override bool EnterMoveNextControl { get; set; } = true; /// <summary>
///
/// </summary>
/// <returns></returns>
protected override PopupBaseForm CreatePopupForm() {
return new MyGridLookUpPopupForm(this);
} /// <summary>
///
/// </summary>
/// <param name="e"></param>
/// <returns></returns>
public override bool IsNeededKey(KeyEventArgs e) {
return this.Properties.IsNeededKey(e.KeyData);
} /// <summary>
/// 正常情况下,在输入第一个字符(主要是数字及字母)后,虽然自动弹出了下拉框并过滤了数据,
/// 但是此时光标并未定位到下拉框中,导致回车后并未返回匹配到的首行记录
/// 此处就是为了解决以上问题,展开下拉框时自动定位到首行
/// </summary>
protected override void OnPopupShown() {
base.OnPopupShown(); BeginInvoke(new Action(() => {
if (this.GetSelectedDataRow() == null) {
this.Properties.View.FocusedRowHandle = ;
}
}));
}
} /// <summary>
/// 匹配自定义编辑器的下拉GridLookUpEdit
/// </summary>
[DXCategory("Properties")]
[UserRepositoryItem("RegisterMyGridLookUpEdit")]
public class RepositoryItemMyGridLookUpEdit : RepositoryItemGridLookUpEdit {
/// <summary>
/// 编辑器的名称
/// </summary>
public const string MyGridLookUpEditName = "MyGridLookUpEdit"; /// <summary>
/// 注册编辑器
/// </summary>
static RepositoryItemMyGridLookUpEdit() {
RegisterCustomGridLookUpEdit();
} /// <summary>
/// 创建自定义的编辑器
/// </summary>
public RepositoryItemMyGridLookUpEdit() {
// 不允许自动完成
base.AutoComplete = false;
} /// <summary>
/// 编辑器名称
/// </summary>
public override string EditorTypeName => MyGridLookUpEditName; /// <summary>
/// 注册编辑器
/// </summary>
public static void RegisterCustomGridLookUpEdit() {
EditorRegistrationInfo.Default.Editors.Add(
new EditorClassInfo(
MyGridLookUpEditName,
typeof(MyGridLookUpEdit),
typeof(RepositoryItemMyGridLookUpEdit),
typeof(GridLookUpEditBaseViewInfo),
new ButtonEditPainter(),
true));
} /// <summary>
/// 创建自定义GridView
/// </summary>
/// <returns></returns>
protected override ColumnView CreateViewInstance() {
return new MyGridView();
} /// <summary>
/// 创建自定义GridControl
/// </summary>
/// <returns></returns>
protected override GridControl CreateGrid() {
return new MyGridControl();
}
} public class MyGridLookUpPopupForm : PopupGridLookUpEditForm
{
public MyGridLookUpPopupForm(GridLookUpEdit ownerEdit)
: base(ownerEdit) {
} protected override void OnKeyDown(KeyEventArgs e) {
if (e.KeyCode == Keys.Tab) {
this.OwnerEdit.EditValue = QueryResultValue();
this.OwnerEdit.SendKey(e);
} base.OnKeyDown(e);
}
}
}

自定义GridLookUpEdit编辑器的更多相关文章

  1. springmvc自定义日期编辑器

    1.控制器 @Controller public class MyController { // 处理器方法 @RequestMapping(value = "/first.do" ...

  2. 使用 TypeScript,React,ANTLR 和 Monaco Editor 创建一个自定义 Web 编辑器(二)

    译文来源 欢迎阅读如何使用 TypeScript, React, ANTLR4, Monaco Editor 创建一个自定义 Web 编辑器系列的第二章节, 在这之前建议您阅读使用 TypeScrip ...

  3. 我的第一个npm包:wechat-menu-editor 基于Vue的微信自定义菜单编辑器

    wechat-menu-editor 微信自定义菜单编辑器 前言 在做微信公众号相关开发时,基本上会去开发的功能就是微信自定义菜单设置的功能,本着不重复造轮子的原则,于是基于Vue封装的一个微信自定义 ...

  4. 自定义GridControl编辑器

    本文版权归博主 惊梦无痕 所有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作.SourceLink 鉴于网上的针对GridControl的一些代码比较凌乱,且功能分散,故将整理过的代码分享出来 ...

  5. C#如何在DataGridViewCell中自定义脚本编辑器

    上一篇博文探讨了如何自定义DataGridViewColumn实现一个TreeViewColumn来在DataGridView控件中显示TreeView控件,其实我们还可以继续发挥想象,自定义其他的列 ...

  6. 如何自定义kindeditor编辑器的工具栏items即去除不必要的工具栏或者保留部分工具栏

    kindeditor编辑器的工具栏主要是指编辑器输入框上方的那些可以操作的菜单,默认情况下编辑器是给予了所有的工具栏.针对不同的用户,不同的项目,不同的环境,可能就需要保留部分工具栏.那么我们应该如何 ...

  7. Unity编辑器:自定义编辑器样式——GUIStyle

    通过GUIStyle,可以自定义Unity编辑器的样式. GUIStyle可以new一个全新的实例,这样,需要自己处理所有自己需要的效果. GUIStyle还可以基于已经存在的实例new一个新的实例, ...

  8. 【Unity】自定义编辑器窗口——拓展编辑器功能

    最近学习了Unity自定义编辑器窗口,下面简单总结,方便用到时回顾. 新建一个脚本: using UnityEngine; using System.Collections; using UnityE ...

  9. 百度编辑器(UEditor)自定义工具栏

    百度编辑器(UEditor)自定义工具栏的自定义 百度编辑器默认功能比较齐全,但是不一定是我们所需要的,有的功能可以去掉,用自己想要的就可以了,可以参考百度官方文档! 百度编辑器默认配置展示界面 如何 ...

随机推荐

  1. 【转】asp.net获取当前页面的url地址

    设当前页完整地址是:http://www.jb51.net/aaa/bbb.aspx?id=5&name=kelli "http://"是协议名 "www.jb5 ...

  2. Python_从字符串中提取号码

    import re telNumber = '''Suppose my Phone No. is 0535-1234567,yours is 010-12345678,his is 025-87654 ...

  3. Spring 的IOC和AOP总结

    Spring 的IOC和AOP IOC 1.IOC 许多应用都是通过彼此间的相互合作来实现业务逻辑的,如类A要调用类B的方法,以前我们都是在类A中,通过自身new一个类B,然后在调用类B的方法,现在我 ...

  4. 第一章:Netty介绍

    1. Netty介绍  Netty是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端,Netty是基于NIO实现的,所以整个Netty都是异步操作,网络应用 ...

  5. 二十五、Hadoop学记笔记————Hive复习与深入

    Hive主要为了简化MapReduce流程,使非编程人员也能进行数据的梳理,即直接使用sql语句代替MapReduce程序 Hive建表的时候元数据(表明,字段信息等)存于关系型数据库中,数据存于HD ...

  6. C#实现联通短信Sgip协议程序源码

    此程序为中国联通Sgip协议程序接口,适合在中国联通申请了短信发送端口的公司使用. 短信群发已经成为现在软件系统.网络营销等必不可少的应用工具.可应用在短信验证.信息群发.游戏虚拟商品购买.事件提醒. ...

  7. Tar专题

    下面的脚本根据当前的系统时间生成压缩文件名,并备份文件到指定目录: DIR=/www/webbackup/web/ FILE_NAME=`date +%y%m%d%H` FILE_NAME=$DIR/ ...

  8. JAVA实现Base64编码的三种方式

    摘要: Javabase64编码的三种方式   有如下三种方式: 方式一:commons-codec.jar Java代码  1. String base64String="whuang12 ...

  9. spring boot actuator专题

    spring-boot-starter-actuator模块的实现对于实施微服务的中小团队来说,可以有效地减少监控系统在采集应用指标时的开发量.当然,它也并不是万能的,有时候我们也需要对其做一些简单的 ...

  10. Containerd 简介

    我们可以把 docker 抽象为下图所示的结构(此图来自互联网): 从图中可以看出,docker 对容器的管理和操作基本都是通过 containerd 完成的. 那么,containerd 是什么呢? ...