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;
}
}
}
}
}