自定义GridLookUpEdit编辑器

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

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Windows.Forms;
  5 using Comteck.Dto;
  6 using DevExpress.XtraEditors;
  7 using DevExpress.XtraEditors.Controls;
  8 using DevExpress.XtraEditors.Drawing;
  9 using DevExpress.XtraEditors.Popup;
 10 using DevExpress.XtraEditors.Registrator;
 11 using DevExpress.XtraEditors.Repository;
 12 using DevExpress.XtraEditors.ViewInfo;
 13 using DevExpress.XtraGrid;
 14 using DevExpress.XtraGrid.Views.Base;
 15
 16 namespace Comteck.Winforms.Controls {
 17   /// <summary>
 18   /// 自定义的GridLookupEdit,允许进行多列的匹配
 19   /// <para>参照:https://www.devexpress.com/Support/Center/Example/Details/E1985 </para>
 20   /// </summary>
 21   [ToolboxItem(true)]
 22   public class MyGridLookUpEdit : GridLookUpEdit {
 23     /// <summary>
 24     /// 自动注册下拉框编辑器
 25     /// </summary>
 26     static MyGridLookUpEdit() {
 27       RepositoryItemMyGridLookUpEdit.RegisterCustomGridLookUpEdit();
 28     }
 29
 30     /// <summary>
 31     /// 创建自定义GridLookupEdit
 32     /// </summary>
 33     public MyGridLookUpEdit() : base() {
 34       Initialize();
 35     }
 36
 37     /// <summary>
 38     /// 初始化
 39     /// </summary>
 40     private void Initialize() {
 41       this.Tag = false;   // 设置全选标记
 42       this.Properties.AllowMouseWheel = false;
 43       //this.EnterMoveNextControl = true;
 44       this.Properties.ImmediatePopup = true;
 45       this.Properties.TextEditStyle = TextEditStyles.Standard;
 46
 47       #region 编辑框默认自动全选
 48
 49       // 鼠标移入文本编辑框触发事件
 50       this.Enter += (sender, e) => {
 51         // 设置全选标记
 52         this.Tag = true;
 53         this.SelectAll();
 54       };
 55       // 获取输入焦点时自动全选
 56       this.MouseUp += (sender, e) => {
 57         // 如果鼠标左键操作并且标记存在,则执行全选
 58         if (e.Button == MouseButtons.Left && (bool)this.Tag) {
 59           this.SelectAll();
 60         }
 61
 62         // 取消全选标记
 63         this.Tag = false;
 64       };
 65       // 双击输入框时自动全选
 66       this.DoubleClick += (sender, e) => {
 67         this.SelectAll();
 68       };
 69
 70       #endregion
 71
 72       this.KeyDown += this.MyGridLookUpEdit_KeyDown;
 73     }
 74
 75     /// <summary>
 76     ///
 77     /// </summary>
 78     /// <param name="sender"></param>
 79     /// <param name="e"></param>
 80     private void MyGridLookUpEdit_KeyDown(object sender, KeyEventArgs e) {
 81       if (e.KeyCode == Keys.Delete) {
 82         var control = sender as BaseEdit;
 83         if (control.ReadOnly) { return; }
 84         control.EditValue = null;
 85         e.Handled = true;
 86       } else if (e.KeyCode == Keys.Down) {
 87         this.ShowPopup();
 88
 89         e.Handled = true;
 90       } else if (e.KeyCode == Keys.Back) {
 91         if (this.IsPopupOpen == false) {
 92           this.ShowPopup();
 93
 94           e.Handled = true;
 95         }
 96       }
 97     }
 98
 99     /// <summary>
100     /// 自定义编辑器名称
101     /// </summary>
102     public override string EditorTypeName => RepositoryItemMyGridLookUpEdit.MyGridLookUpEditName;
103
104     /// <summary>
105     /// 重写下拉框编辑器
106     /// </summary>
107     [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
108     public new RepositoryItemMyGridLookUpEdit Properties => base.Properties as RepositoryItemMyGridLookUpEdit;
109
110     //
111     // 摘要:
112     //     Gets or sets whether focus is moved to the next control (according to the tab
113     //     order) when an end-user presses ENTER.
114     [DefaultValue(true)]
115     [DXCategory("Behavior")]
116     public override bool EnterMoveNextControl { get; set; } = true;
117
118     /// <summary>
119     ///
120     /// </summary>
121     /// <returns></returns>
122     protected override PopupBaseForm CreatePopupForm() {
123       return new MyGridLookUpPopupForm(this);
124     }
125
126     /// <summary>
127     ///
128     /// </summary>
129     /// <param name="e"></param>
130     /// <returns></returns>
131     public override bool IsNeededKey(KeyEventArgs e) {
132       return this.Properties.IsNeededKey(e.KeyData);
133     }
134
135     /// <summary>
136     /// 正常情况下,在输入第一个字符(主要是数字及字母)后,虽然自动弹出了下拉框并过滤了数据,
137     /// 但是此时光标并未定位到下拉框中,导致回车后并未返回匹配到的首行记录
138     /// 此处就是为了解决以上问题,展开下拉框时自动定位到首行
139     /// </summary>
140     protected override void OnPopupShown() {
141       base.OnPopupShown();
142
143       BeginInvoke(new Action(() => {
144         if (this.GetSelectedDataRow() == null) {
145           this.Properties.View.FocusedRowHandle = 0;
146         }
147       }));
148     }
149   }
150
151   /// <summary>
152   /// 匹配自定义编辑器的下拉GridLookUpEdit
153   /// </summary>
154   [DXCategory("Properties")]
155   [UserRepositoryItem("RegisterMyGridLookUpEdit")]
156   public class RepositoryItemMyGridLookUpEdit : RepositoryItemGridLookUpEdit {
157     /// <summary>
158     /// 编辑器的名称
159     /// </summary>
160     public const string MyGridLookUpEditName = "MyGridLookUpEdit";
161
162     /// <summary>
163     /// 注册编辑器
164     /// </summary>
165     static RepositoryItemMyGridLookUpEdit() {
166       RegisterCustomGridLookUpEdit();
167     }
168
169     /// <summary>
170     /// 创建自定义的编辑器
171     /// </summary>
172     public RepositoryItemMyGridLookUpEdit() {
173       // 不允许自动完成
174       base.AutoComplete = false;
175     }
176
177     /// <summary>
178     /// 编辑器名称
179     /// </summary>
180     public override string EditorTypeName => MyGridLookUpEditName;
181
182     /// <summary>
183     /// 注册编辑器
184     /// </summary>
185     public static void RegisterCustomGridLookUpEdit() {
186       EditorRegistrationInfo.Default.Editors.Add(
187           new EditorClassInfo(
188               MyGridLookUpEditName,
189               typeof(MyGridLookUpEdit),
190               typeof(RepositoryItemMyGridLookUpEdit),
191               typeof(GridLookUpEditBaseViewInfo),
192               new ButtonEditPainter(),
193               true));
194     }
195
196     /// <summary>
197     /// 创建自定义GridView
198     /// </summary>
199     /// <returns></returns>
200     protected override ColumnView CreateViewInstance() {
201       return new MyGridView();
202     }
203
204     /// <summary>
205     /// 创建自定义GridControl
206     /// </summary>
207     /// <returns></returns>
208     protected override GridControl CreateGrid() {
209       return new MyGridControl();
210     }
211   }
212
213   public class MyGridLookUpPopupForm : PopupGridLookUpEditForm
214   {
215     public MyGridLookUpPopupForm(GridLookUpEdit ownerEdit)
216         : base(ownerEdit) {
217     }
218
219     protected override void OnKeyDown(KeyEventArgs e) {
220       if (e.KeyCode == Keys.Tab) {
221         this.OwnerEdit.EditValue = QueryResultValue();
222         this.OwnerEdit.SendKey(e);
223       }
224
225       base.OnKeyDown(e);
226     }
227   }
228 }

原文地址:https://www.cnblogs.com/geping/p/10407689.html

时间: 2024-11-04 11:09:05

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

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

kindeditor编辑器的工具栏主要是指编辑器输入框上方的那些可以操作的菜单,默认情况下编辑器是给予了所有的工具栏.针对不同的用户,不同的项目,不同的环境,可能就需要保留部分工具栏.那么我们应该如何自定义自己想要的工具栏呢?工具栏如何编辑呢?我们分几种情况来加以阐述: 第一种:修改原始文件kindeditor.js对工具栏进行统一调整 kindeditor编辑器包内有一个kindeditor.js或者kindeditor-min.js文件,这个文件主要是包含了编辑器的整个基本配置以及一些基本的

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

百度编辑器(UEditor)自定义工具栏的自定义 百度编辑器默认功能比较齐全,但是不一定是我们所需要的,有的功能可以去掉,用自己想要的就可以了,可以参考百度官方文档! 百度编辑器默认配置展示界面 如何自定义工具栏: 方法一:在实例化编辑器的时候红色文字部分便是你所需要的 1 <script type="text/Javascript"> 2 var editor = UE.getEditor('container',{ 3 //这里可以选择自己需要的工具按钮名称,此处仅选择

解决在自定义编辑器下,无法用Inspector面板的赋值作为参数显示Gizmos的问题

之前在给策划童鞋写一个小脚本,为了让他们使用时能很快了解用法,自定义了编辑器,重写了一下脚本的inspector面板布局和显示逻辑. 但发现一个问题,就是一旦自定义了Editor,Gizmo的绘图包含通过编辑器赋值的参数就不能使用了.也就是说,假如我想Gizmos.DrawLine(from * param, to * param);其中 param 为编辑器赋值参数,这时Gizmo会一直使用默认值. 我想这也很好理解,扩展的东西Gizmo当然是不知道的.于是google了一下,几经波折(主要是

(转)Unity笔记之编辑器(UnityEditor)

在使用unity3d的过程中,时常会需要从场景中寻找或者调用一个对象,而Unity就提供了一个贴心的功能——拖拽.用鼠标拖一下中比写堆代码直观的多吧!但是Unity提供的远远不止这一丢丢,下面我们来简单了解下UnityEditor部分的内容. 编辑器最最基本的用法呢就是编辑Inspector. 而Inspector中最最基本的就是把字段显示出来.给几个例子: [code]csharpcode: using UnityEngine; using System.Collections; // 这里没

一步步开发自己的博客 .NET版(4、文章发布功能)百度编辑器

前言 这次开发的博客主要功能或特点:    第一:可以兼容各终端,特别是手机端.    第二:到时会用到大量html5,炫啊.    第三:导入博客园的精华文章,并做分类.(不要封我)    第四:做个插件,任何网站上的技术文章都可以转发收藏 到本博客. 所以打算写个系类:<一步步搭建自己的博客> 一.一步步开发自己的博客  .NET版(1.页面布局.blog迁移.数据加载) 二.一步步开发自己的博客  .NET版(2.评论功能) 三.一步步开发自己的博客  .NET版(3.注册登录功能) 四

百度编辑器Ueditor 初始化加载内容失败解决办法

项目上有用到百度文本编辑器ueditor,在页面加载的时候初始化编辑器内容时候,使用 $.document.ready(function() { UE.getEditor('editor').setContent('欢迎光临'); }) setContent方法无法加载内容,提示编辑器为空,后来想想,可能是编辑器还没有加载完就执行此脚本导致的.后在网上找资料,可以判断ueditor编辑器完成加载后再加载内容: 核心内容如下 var editor_a = new baidu.editor.ui.E

C# winform 安装程序打包(自定义操作)

(一),安装程序 以前用vs制作过安装程序,现在把步骤写出来,有帮助的大家一定要顶哦 第一步:建立工程1.打开vs,新建项目->其他项目类型->安装和部署(這個子项下面有安装项目和Web安装项目等,安装项目就是普通的桌面程序安装,Web安装就是安装网站,通常安装到IIS下,这里以普通桌面程序安装为例),新建安装项目,命名为SetupTest. 2.新建工程后,可以在“解决方案资源管理器”里面看到子项:文件系统编辑器,注册表编辑器,文件类型编辑器,用户界面编辑器,自定义操作编辑器,启动条件编辑器

C#制作自定义安装程序

(一),安装程序 以前用vs制作过安装程序,现在把步骤写出来,有帮助的大家一定要顶哦 第一步:建立工程 1.打开vs,新建项目->其他项目类型->安装和部署(這個子项下面有安装项目和Web安装项目等,安装项目就是普通的桌面程序安装,Web安装就是安装网站,通常安装到IIS下,这里以普通桌面程序安装为例),新建安装项目,命名为SetupTest. 2.新建工程后,可以在“解决方案资源管理器”里面看到子项:文件系统编辑器,注册表编辑器,文件类型编辑器,用户界面编辑器,自定义操作编辑器,启动条件编辑

【转】C# winform 安装程序打包(自定义操作)

(一),安装程序 以前用vs制作过安装程序,现在把步骤写出来,有帮助的大家一定要顶哦 第一步:建立工程1.打开vs,新建项目->其他项目类型->安装和部署(這個子项下面有安装项目和Web安装项目等,安装项目就是普通的桌面程序安装,Web安装就是安装网站,通常安装到IIS下,这里以普通桌面程序安装为例),新建安装项目,命名为SetupTest. 2.新建工程后,可以在“解决方案资源管理器”里面看到子项:文件系统编辑器,注册表编辑器,文件类型编辑器,用户界面编辑器,自定义操作编辑器,启动条件编辑器