SearchLookUpEditExtension.cs 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222
  1. using DevExpress.CodeParser;
  2. using DevExpress.Utils;
  3. using DevExpress.XtraEditors;
  4. using DevExpress.XtraEditors.Repository;
  5. using DevExpress.XtraGrid.Columns;
  6. using DevExpress.XtraGrid.Views.Grid;
  7. using DW5S.ViewModel;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.ComponentModel;
  11. using System.ComponentModel.DataAnnotations;
  12. using System.Drawing;
  13. using System.Drawing.Drawing2D;
  14. using System.IO;
  15. using System.Linq;
  16. using System.Linq.Expressions;
  17. using System.Reflection;
  18. using System.Text;
  19. using System.Threading.Tasks;
  20. using System.Windows.Forms;
  21. namespace ExtensionsDev
  22. {
  23. /// <summary>
  24. ///
  25. /// </summary>
  26. public static class SearchLookUpEditExtension
  27. {
  28. /// <summary>
  29. /// 设置SearchLookUpEdit默认属性
  30. /// </summary>
  31. /// <param name="ctrl"></param>
  32. /// <param name="nullText">数据源</param>
  33. /// <param name="showClearBtn"></param>
  34. public static SearchLookUpEdit UseDefault(this SearchLookUpEdit ctrl, string nullText = "请选择", bool showClearBtn = false)
  35. {
  36. ctrl.EditValue = null;
  37. ctrl.Properties.NullText = null;
  38. ctrl.Properties.NullValuePrompt = nullText;
  39. ctrl.Properties.AllowFocused = false;
  40. ctrl.Properties.ShowNullValuePrompt = ShowNullValuePromptOptions.Default;
  41. ctrl.Properties.ShowAddNewButton = false;
  42. ctrl.Properties.ShowClearButton = showClearBtn;
  43. ctrl.Properties.ShowFooter = false;
  44. ctrl.Properties.ShowPopupShadow = true;
  45. return ctrl;
  46. }
  47. public static RepositoryItemSearchLookUpEdit UseDefault(this RepositoryItemSearchLookUpEdit ctrl, string nullText = "请选择", bool showClearBtn = false)
  48. {
  49. ctrl.NullText = null;
  50. ctrl.NullValuePrompt = nullText;
  51. ctrl.AllowFocused = false;
  52. ctrl.ShowNullValuePrompt = ShowNullValuePromptOptions.Default;
  53. ctrl.ShowAddNewButton = false;
  54. ctrl.ShowClearButton = showClearBtn;
  55. ctrl.ShowFooter = false;
  56. ctrl.ShowPopupShadow = true;
  57. return ctrl;
  58. }
  59. /// <summary>
  60. /// 绑定SearchLookUpEdit数据源
  61. /// </summary>
  62. /// <param name="ctrl"></param>
  63. /// <param name="data">数据源</param>
  64. public static SearchLookUpEdit SetStringData(this SearchLookUpEdit ctrl, IEnumerable<string> data)
  65. {
  66. ctrl.Properties.DataSource = data;
  67. GridView view = ctrl.Properties.View;
  68. view.OptionsView.ShowColumnHeaders = false;
  69. view.GridControl.UseDefault<string>(null);
  70. return ctrl;
  71. }
  72. public static SearchLookUpEdit SetData<T>(this SearchLookUpEdit ctrl, List<T> data, string displayField, string valueField = "This")
  73. {
  74. ctrl.EditValue = null;
  75. ctrl.Properties.ValueMember = valueField;
  76. ctrl.Properties.KeyMember = valueField;
  77. ctrl.Properties.DisplayMember = displayField;
  78. ctrl.QueryPopUp += Ctrl_QueryPopUp;
  79. ctrl.Properties.DataSource = data;
  80. GridView view = ctrl.Properties.View;
  81. view.Tag = ctrl;
  82. view.OptionsView.ShowColumnHeaders = true;
  83. view.GridControl.UseDefault<T>(null);
  84. return ctrl;
  85. }
  86. public static SearchLookUpEdit SetData<T>(this SearchLookUpEdit ctrl, Func<Task<IEnumerable<T>>> onGetDataAsync, string displayField, string valueField = "This")
  87. {
  88. ctrl.EditValue = null;
  89. ctrl.EditValueChanged += async (sender, e) =>
  90. {
  91. if (ctrl.EditValue is T t && t != null)
  92. {
  93. if (ctrl.Properties.DataSource == null)
  94. {
  95. ctrl.Properties.DataSource = await onGetDataAsync();
  96. }
  97. }
  98. };
  99. ctrl.Properties.ValueMember = valueField;
  100. ctrl.Properties.KeyMember = valueField;
  101. ctrl.Properties.DisplayMember = displayField;
  102. ctrl.QueryPopUp += Ctrl_QueryPopUp;
  103. ctrl.Tag = onGetDataAsync;
  104. GridView view = ctrl.Properties.View;
  105. view.Tag = ctrl;
  106. view.OptionsView.ShowColumnHeaders = true;
  107. view.GridControl.UseDefault<T>(null);
  108. //ctrl.Properties.DataSource = onGetDataAsync().Result;
  109. return ctrl;
  110. }
  111. public static async void SetEditValue<T>(this SearchLookUpEdit ctrl, Func<T, bool> predicate)
  112. {
  113. if (ctrl.Properties.DataSource == null)
  114. {
  115. var onGetData = (Func<dynamic>)ctrl.Tag;
  116. if (onGetData != null)
  117. {
  118. ctrl.Properties.DataSource = await onGetData();
  119. }
  120. }
  121. var data = ctrl.Properties.DataSource as List<T>;
  122. var item = data.Where(predicate).FirstOrDefault();
  123. ctrl.EditValue = item;
  124. }
  125. internal static RepositoryItemSearchLookUpEdit SetData<T>(this RepositoryItemSearchLookUpEdit ctrl, List<T> data)
  126. {
  127. ctrl.QueryPopUp += Ctrl_QueryPopUp;
  128. ctrl.DataSource = data;
  129. GridView view = ctrl.View;
  130. view.Layout += (sender, e) =>
  131. {
  132. (sender as GridView).SaveLayoutToXml($"Layout\\{ctrl.Name}.xml", OptionsLayoutBase.FullLayout);
  133. };
  134. if (File.Exists($"Layout\\{ctrl.Name}.xml"))
  135. {
  136. view.RestoreLayoutFromXml($"Layout\\{ctrl.Name}.xml", OptionsLayoutBase.FullLayout);
  137. view.ClearColumnsFilter();
  138. view.ClearFindFilter();
  139. view.ClearInHeaderSearchText();
  140. view.ClearSorting();
  141. view.ClearSelection();
  142. }
  143. view.Tag = ctrl;
  144. view.OptionsView.ShowColumnHeaders = true;
  145. return ctrl;
  146. }
  147. internal static RepositoryItemSearchLookUpEdit SetData<T>(this RepositoryItemSearchLookUpEdit ctrl, Func<Task<List<T>>> onGetDataAsync)
  148. {
  149. ctrl.QueryPopUp += Ctrl_QueryPopUp;
  150. ctrl.Tag = onGetDataAsync;
  151. GridView view = ctrl.View;
  152. view.Layout += (sender, e) =>
  153. {
  154. (sender as GridView).SaveLayoutToXml($"Layout\\{ctrl.Name}.xml", OptionsLayoutBase.FullLayout);
  155. };
  156. if (File.Exists($"Layout\\{ctrl.Name}.xml"))
  157. {
  158. view.RestoreLayoutFromXml($"Layout\\{ctrl.Name}.xml", OptionsLayoutBase.FullLayout);
  159. view.ClearColumnsFilter();
  160. view.ClearFindFilter();
  161. view.ClearInHeaderSearchText();
  162. view.ClearSorting();
  163. view.ClearSelection();
  164. }
  165. view.Tag = ctrl;
  166. view.OptionsView.ShowColumnHeaders = true;
  167. return ctrl;
  168. }
  169. private static async void Ctrl_QueryPopUp(object sender, System.ComponentModel.CancelEventArgs e)
  170. {
  171. var ctrl = sender as SearchLookUpEdit;
  172. var view = ctrl.Properties.View;
  173. view.GridControl.HideColumn("CreateTime", "UpdateTime", "Enable", "Enabled", "IsEnable", "Remark");
  174. view.GridControl.HideColumn(p => p.FieldName.ToUpper().EndsWith("ID"));
  175. view.GridControl.HideColumn(p => p.ColumnType == typeof(List<>));
  176. //view.GridControl.HideColumn(p => p.ColumnType.BaseType != null && p.ColumnType.BaseType.Name.Contains("BaseEntity"));
  177. if (ctrl.Tag is RepositoryItemSearchLookUpEdit edit)
  178. {
  179. var onGetData = (Func<dynamic>)edit.Tag;
  180. if (onGetData != null)
  181. {
  182. ctrl.Properties.DataSource = await onGetData();
  183. edit.DataSource = await onGetData();
  184. }
  185. }
  186. else
  187. {
  188. var onGetData = (Func<dynamic>)ctrl.Tag;
  189. if (onGetData != null)
  190. {
  191. ctrl.Properties.DataSource = await onGetData();
  192. }
  193. }
  194. var dataType = view.DataSource.GetType().GetGenericArguments().Single();
  195. var props = dataType.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
  196. foreach (GridColumn column in view.Columns)
  197. {
  198. if (column.Visible)
  199. {
  200. var prop = props.FirstOrDefault(p => p.Name == column.FieldName);
  201. if (prop == null) continue;
  202. var attrDisplay = prop.GetCustomAttribute<DisplayAttribute>();
  203. var attrDisplayName = prop.GetCustomAttribute<DisplayNameAttribute>();
  204. if (attrDisplay == null && attrDisplayName == null)
  205. column.Visible = false;
  206. else if (attrDisplay != null && attrDisplay.GetAutoGenerateFilter() != null && !attrDisplay.AutoGenerateFilter)
  207. column.Visible = false;
  208. else
  209. column.Visible = true;
  210. }
  211. }
  212. }
  213. }
  214. }