using DevExpress.CodeParser; using DevExpress.Utils; using DevExpress.XtraEditors; using DevExpress.XtraEditors.Repository; using DevExpress.XtraGrid.Columns; using DevExpress.XtraGrid.Views.Grid; using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Drawing; using System.Drawing.Drawing2D; using System.IO; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace ExtensionsDev { /// /// /// public static class SearchLookUpEditExtension { /// /// 设置SearchLookUpEdit默认属性 /// /// /// 数据源 /// public static SearchLookUpEdit UseDefault(this SearchLookUpEdit ctrl, string nullText = "请选择", bool showClearBtn = false) { ctrl.EditValue = null; ctrl.Properties.NullText = null; ctrl.Properties.NullValuePrompt = nullText; ctrl.Properties.AllowFocused = false; ctrl.Properties.ShowNullValuePrompt = ShowNullValuePromptOptions.Default; ctrl.Properties.ShowAddNewButton = false; ctrl.Properties.ShowClearButton = showClearBtn; ctrl.Properties.ShowFooter = false; ctrl.Properties.ShowPopupShadow = true; return ctrl; } public static RepositoryItemSearchLookUpEdit UseDefault(this RepositoryItemSearchLookUpEdit ctrl, string nullText = "请选择", bool showClearBtn = false) { ctrl.NullText = null; ctrl.NullValuePrompt = nullText; ctrl.AllowFocused = false; ctrl.ShowNullValuePrompt = ShowNullValuePromptOptions.Default; ctrl.ShowAddNewButton = false; ctrl.ShowClearButton = showClearBtn; ctrl.ShowFooter = false; ctrl.ShowPopupShadow = true; return ctrl; } /// /// 绑定SearchLookUpEdit数据源 /// /// /// 数据源 public static SearchLookUpEdit SetStringData(this SearchLookUpEdit ctrl, IEnumerable data) { ctrl.Properties.DataSource = data; GridView view = ctrl.Properties.View; view.OptionsView.ShowColumnHeaders = false; view.GridControl.UseDefault(null); return ctrl; } public static SearchLookUpEdit SetData(this SearchLookUpEdit ctrl, IEnumerable data, string valueField = "Id", string displayField = "") { ctrl.Properties.ValueMember = valueField; ctrl.Properties.KeyMember = valueField; ctrl.Properties.DisplayMember = displayField; ctrl.QueryPopUp += Ctrl_QueryPopUp; ctrl.Properties.DataSource = data; GridView view = ctrl.Properties.View; view.Tag = ctrl; view.OptionsView.ShowColumnHeaders = true; view.GridControl.UseDefault(null); ctrl.CustomDisplayText += (sender, e) => { if (e.Value == null) return; if (typeof(T) != e.Value.GetType()) { e.DisplayText = e.Value.ToString(); } else if (string.IsNullOrWhiteSpace(displayField)) { e.DisplayText = e.Value.ToString(); } else { e.DisplayText = typeof(T).GetProperty(displayField).GetValue(e.Value).ToString(); } }; return ctrl; } public static SearchLookUpEdit SetData(this SearchLookUpEdit ctrl, Func>> onGetDataAsync, string valueField = "Id", string displayField = "") { ctrl.Properties.ValueMember = valueField; ctrl.Properties.KeyMember = valueField; ctrl.Properties.DisplayMember = displayField; ctrl.QueryPopUp += Ctrl_QueryPopUp; ctrl.Tag = onGetDataAsync; GridView view = ctrl.Properties.View; view.Tag = ctrl; view.OptionsView.ShowColumnHeaders = true; view.GridControl.UseDefault(null); ctrl.Properties.DataSource = onGetDataAsync().Result; return ctrl; } internal static RepositoryItemSearchLookUpEdit SetData(this RepositoryItemSearchLookUpEdit ctrl, List data) { ctrl.QueryPopUp += Ctrl_QueryPopUp; ctrl.DataSource = data; GridView view = ctrl.View; view.Layout += (sender, e) => { (sender as GridView).SaveLayoutToXml($"Layout\\{ctrl.Name}.xml", OptionsLayoutBase.FullLayout); }; if (File.Exists($"Layout\\{ctrl.Name}.xml")) { view.RestoreLayoutFromXml($"Layout\\{ctrl.Name}.xml", OptionsLayoutBase.FullLayout); view.ClearColumnsFilter(); view.ClearFindFilter(); view.ClearInHeaderSearchText(); view.ClearSorting(); view.ClearSelection(); } view.Tag = ctrl; view.OptionsView.ShowColumnHeaders = true; return ctrl; } internal static RepositoryItemSearchLookUpEdit SetData(this RepositoryItemSearchLookUpEdit ctrl, Func>> onGetDataAsync) { ctrl.QueryPopUp += Ctrl_QueryPopUp; ctrl.Tag = onGetDataAsync; GridView view = ctrl.View; view.Layout += (sender, e) => { (sender as GridView).SaveLayoutToXml($"Layout\\{ctrl.Name}.xml", OptionsLayoutBase.FullLayout); }; if (File.Exists($"Layout\\{ctrl.Name}.xml")) { view.RestoreLayoutFromXml($"Layout\\{ctrl.Name}.xml", OptionsLayoutBase.FullLayout); view.ClearColumnsFilter(); view.ClearFindFilter(); view.ClearInHeaderSearchText(); view.ClearSorting(); view.ClearSelection(); } view.Tag = ctrl; view.OptionsView.ShowColumnHeaders = true; return ctrl; } private static async void Ctrl_QueryPopUp(object sender, System.ComponentModel.CancelEventArgs e) { var ctrl = sender as SearchLookUpEdit; var view = ctrl.Properties.View; view.GridControl.HideColumn("CreateTime", "UpdateTime", "Enable", "Enabled", "IsEnable", "Remark"); view.GridControl.HideColumn(p => p.FieldName.ToUpper().EndsWith("ID")); view.GridControl.HideColumn(p => p.ColumnType == typeof(List<>)); view.GridControl.HideColumn(p => p.ColumnType.BaseType != null && p.ColumnType.BaseType.Name.Contains("BaseEntity")); if (ctrl.Tag is RepositoryItemSearchLookUpEdit edit) { var onGetData = (Func)edit.Tag; if (onGetData != null) { ctrl.Properties.DataSource = await onGetData(); edit.DataSource = await onGetData(); } } else { var onGetData = (Func)ctrl.Tag; if (onGetData != null) { ctrl.Properties.DataSource = await onGetData(); } } var dataType = view.DataSource.GetType().GetGenericArguments().Single(); var props = dataType.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance); foreach (GridColumn column in view.Columns) { if (column.Visible) { var prop = props.FirstOrDefault(p => p.Name == column.FieldName); if (prop == null) continue; var attrDisplay = prop.GetCustomAttribute(); var attrDisplayName = prop.GetCustomAttribute(); if (attrDisplay == null && attrDisplayName == null) column.Visible = false; else if (attrDisplay != null && attrDisplay.GetAutoGenerateFilter() != null && !attrDisplay.AutoGenerateFilter) column.Visible = false; else column.Visible = true; } } } } }