本文版权归博主 惊梦无痕 所有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作。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 }