SearchLookUpEditExtension.cs 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. using DevExpress.XtraEditors;
  2. using DevExpress.XtraEditors.Controls;
  3. using DevExpress.XtraGrid.Columns;
  4. using DevExpress.XtraGrid.Views.Grid;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.ComponentModel;
  8. using System.ComponentModel.DataAnnotations;
  9. using System.Drawing;
  10. using System.IO;
  11. using System.Linq;
  12. using System.Reflection;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. using System.Windows.Forms;
  16. namespace ExtensionsDev
  17. {
  18. /// <summary>
  19. ///
  20. /// </summary>
  21. public static class SearchLookUpEditExtension
  22. {
  23. /// <summary>
  24. /// 设置SearchLookUpEdit默认属性
  25. /// </summary>
  26. /// <param name="ctrl"></param>
  27. /// <param name="data">数据源</param>
  28. public static SearchLookUpEdit UseDefault(this SearchLookUpEdit ctrl, string nullText = "请选择", bool showClearBtn = false)
  29. {
  30. ctrl.EditValue = null;
  31. ctrl.Properties.NullText = null;
  32. ctrl.Properties.NullValuePrompt = nullText;
  33. ctrl.Properties.AllowFocused = false;
  34. ctrl.Properties.ShowNullValuePrompt = ShowNullValuePromptOptions.Default;
  35. ctrl.Properties.ShowAddNewButton = false;
  36. ctrl.Properties.ShowClearButton = showClearBtn;
  37. ctrl.Properties.ShowFooter = false;
  38. ctrl.Properties.ShowPopupShadow = true;
  39. return ctrl;
  40. }
  41. /// <summary>
  42. /// 绑定SearchLookUpEdit数据源
  43. /// </summary>
  44. /// <param name="ctrl"></param>
  45. /// <param name="data">数据源</param>
  46. public static SearchLookUpEdit SetStringData(this SearchLookUpEdit ctrl, IEnumerable<string> data)
  47. {
  48. ctrl.Properties.DataSource = data;
  49. GridView view = ctrl.Properties.View;
  50. view.OptionsView.ShowColumnHeaders = false;
  51. view.GridControl.Init<string>(searchLookUpEdit: ctrl);
  52. return ctrl;
  53. }
  54. /// <summary>
  55. /// 绑定SearchLookUpEdit数据源
  56. /// </summary>
  57. /// <param name="ctrl"></param>
  58. /// <param name="data">数据源</param>
  59. public static SearchLookUpEdit SetData<T>(this SearchLookUpEdit ctrl, List<T> data, string displayField = "")
  60. {
  61. ctrl.QueryPopUp += Ctrl_QueryPopUp;
  62. ctrl.Properties.DataSource = data;
  63. GridView view = ctrl.Properties.View;
  64. view.OptionsView.ShowColumnHeaders = true;
  65. view.GridControl.Init<T>(searchLookUpEdit:ctrl);
  66. ctrl.CustomDisplayText += (sender, e) =>
  67. {
  68. if (e.Value == null) return;
  69. if (string.IsNullOrWhiteSpace(displayField))
  70. e.DisplayText = e.Value.ToString();
  71. else
  72. {
  73. e.DisplayText = typeof(T).GetProperty(displayField).GetValue(e.Value).ToString();
  74. }
  75. };
  76. return ctrl;
  77. }
  78. private static void Ctrl_QueryPopUp(object sender, System.ComponentModel.CancelEventArgs e)
  79. {
  80. var ctrl = sender as SearchLookUpEdit;
  81. var view = ctrl.Properties.View;
  82. var dataType = view.DataSource.GetType().GetGenericArguments().Single();
  83. var props = dataType.GetProperties(System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Instance);
  84. foreach (GridColumn column in view.Columns)
  85. {
  86. if (column.Visible)
  87. {
  88. var prop = props.First(p => p.Name == column.FieldName);
  89. var attrDisplay = prop.GetCustomAttribute<DisplayAttribute>();
  90. var attrDisplayName = prop.GetCustomAttribute<DisplayNameAttribute>();
  91. if (attrDisplay == null && attrDisplayName == null)
  92. column.Visible = false;
  93. else if (attrDisplay != null && attrDisplay.GetAutoGenerateFilter() != null && !attrDisplay.AutoGenerateFilter)
  94. column.Visible = false;
  95. else
  96. column.Visible = true;
  97. }
  98. }
  99. }
  100. public static SearchLookUpEdit SetSearchGridLookUpEditMultiSelected<T>(this SearchLookUpEdit ctrl,string nullText = "请选择")
  101. {
  102. var view = ctrl.Properties.PopupView as DevExpress.XtraGrid.Views.Grid.GridView;
  103. view.OptionsSelection.MultiSelect = true;
  104. view.OptionsSelection.MultiSelectMode = DevExpress.XtraGrid.Views.Grid.GridMultiSelectMode.CheckBoxRowSelect;
  105. view.OptionsSelection.CheckBoxSelectorColumnWidth = 45;
  106. ctrl.EditValue = null;
  107. ctrl.Properties.NullText = null;
  108. ctrl.Properties.NullValuePrompt = nullText;
  109. ctrl.Properties.AllowFocused = false;
  110. ctrl.Properties.ShowNullValuePrompt = ShowNullValuePromptOptions.Default;
  111. ctrl.Properties.ShowAddNewButton = false;
  112. var values = new List<T>();
  113. //var keys = new List<string>();
  114. var texts = new List<string>();
  115. ctrl.Properties.Tag = values;
  116. // ctrl.Tag = keys;
  117. ctrl.Popup += (s, e) =>
  118. {
  119. view.ClearSelection();
  120. view.BeginSelection();
  121. for (int i = 0; i < view.RowCount; i++)
  122. {
  123. var value = view.GetRow(i);
  124. if (values.Any(a=>a.ToJsonStr()==value.ToJsonStr()))
  125. {
  126. view.SelectRow(i);
  127. }
  128. }
  129. view.EndSelection();
  130. };
  131. ctrl.CloseUp += (s, e) =>
  132. {
  133. values.Clear();
  134. texts.Clear();
  135. var indexs = view.GetSelectedRows();
  136. foreach ( var row in indexs )
  137. {
  138. var value =view.GetRow(row).MapTo<T>();
  139. values.Add(value);
  140. var text = view.GetRowCellDisplayText(row, ctrl.Properties.DisplayMember);
  141. texts.Add(text);
  142. //var key = view.GetRowCellDisplayText(row, ctrl.Properties.KeyMember);
  143. //keys.Add(key);
  144. }
  145. ctrl.RefreshEditValue();
  146. };
  147. ctrl.Properties.CustomDisplayText += (s, e) =>
  148. {
  149. if (!ctrl.IsPopupOpen)
  150. e.DisplayText = string.Join(",", texts.ToArray());
  151. };
  152. return ctrl;
  153. }
  154. }
  155. }