本文版权归博主  惊梦无痕  所有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作。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. day13_Mysql事务与数据库连接池学习笔记

    一.Mysql事务 事务: 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部不成功(数据回滚).  例如:A给B转帐,对应于如下两条sql语句 : update account ...

  2. Python_异常处理结构与调试

    while True: x =input('Pleaes input:') try: x=int(x) print('You have input {0}'.format(x)) break exce ...

  3. Collection、List、Set集合概括

    1.Collection是一个接口,定义了集合相关的操作方法,其有两个子接口List和Set. 2.List和Set的区别    List是有序的可重复集合,Set是无序的不可重复集合. 3.集合持有 ...

  4. backbone的一些认识

    body,td { font-family: 微软雅黑; font-size: 10pt } 官网:http://backbonejs.org/ 作者:Jeremy Ashkenas 杰里米·阿什肯纳 ...

  5. linux或Mac中./与/

      mac终端命令和linux中命令是一致的,在执行可执行xxx.sh文件时,需要进入xxx.sh文件所在的目录,然后输入./xxx.sh才可以执行成功 1.为什么需要添加./   因为linux/u ...

  6. PHP Simple HTML DOM解析器使用入门

    http://www.cnphp.info/php-simple-html-dom-parser-intro.html 一直以来使用php解析html文档树都是一个难题.Simple HTML DOM ...

  7. 玩转spring MVC(七)----拦截器

    继续在前边的基础上来学习spring MVC中拦截器的使用,下面通过一个例子来实现(完整项目在这里下载:http://download.csdn.net/detail/u012116457/84334 ...

  8. 底层网络技术以及IP编址

    网络信息的传输在最底层总是依托于物理介质来进行传输的,这里的传输介质分为两种: 有线介质  导线管(导向媒体).例如:双绞线.同轴电缆.光纤等 无线介质  电磁波(非导向媒体):利用各种波长的电磁波充 ...

  9. Kafka元数据缓存(metadata cache)

    经常有人问的一个问题就是:Kafka broker到底是不是无状态的?网上有这样的说法: 正常情况下consumer会在消费完一条消息后线性增加这个offset.当然,consumer也可将offse ...

  10. golang 通过exec Command启动的进程如何关闭的解决办法 以及隐藏黑色窗口

    golang 通过exec Command启动的进程如何关闭的解决办法 在用exec包调用的其他进程后如何关闭结束,可以使用context包的机制进行管理,context包的使用详见:https:// ...