自定义GridLookUpEdit编辑器

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

前两天分享了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 }

 

posted @ 2019-02-20 16:57  惊梦无痕  阅读(1382)  评论(0编辑  收藏  举报