前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c#多选下拉框(ComboBox)

c#多选下拉框(ComboBox)

作者头像
冰封一夏
发布2019-09-11 15:29:02
8.4K1
发布2019-09-11 15:29:02
举报

代码如下

代码语言:javascript
复制
  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Drawing;
  5 using System.Data;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9 using System.Collections;
 10 using System.Reflection;
 11 using Newtonsoft.Json.Linq;
 12 
 13 namespace ControlsAA
 14 {
 15     public class ComboBoxEx : ComboBox
 16     {
 17         TreeView lst = new TreeView();
 18       
 19         public ComboBoxEx()
 20         {
 21             this.DrawMode = DrawMode.OwnerDrawFixed;//只有设置这个属性为OwnerDrawFixed才可能让重画起作用
 22             lst.KeyUp += new KeyEventHandler(lst_KeyUp);
 23             lst.MouseUp += new MouseEventHandler(lst_MouseUp);
 24             // lst.KeyDown += new KeyEventHandler(lst_KeyDown);
 25             lst.Leave += new EventHandler(lst_Leave);
 26             lst.CheckBoxes = true;
 27             lst.ShowLines = false;
 28             lst.ShowPlusMinus = false;
 29             lst.ShowRootLines = false;
 30             this.DropDownHeight = 1;
 31         }
 32 
 33         void lst_Leave(object sender, EventArgs e)
 34         {
 35             lst.Hide();
 36         }
 37         #region Property
 38      
 39         [Description("选定项的值"), Category("Data")]
 40         public List<TreeNode> SelectedItems
 41         {
 42             get
 43             {
 44                 List<TreeNode> lsttn = new List<TreeNode>();
 45                 foreach (TreeNode tn in lst.Nodes)
 46                 {
 47                     if (tn.Checked)
 48                     {
 49                         lsttn.Add(tn);
 50                     }
 51                 }
 52                 return lsttn;
 53             }
 54         }
 55 
 56         /// <summary>
 57         /// 数据源
 58         /// </summary>
 59         [Description("数据源"), Category("Data")]
 60         public object DataSource
 61         {
 62             get;
 63             set;
 64         }
 65         /// <summary>
 66         /// 显示字段
 67         /// </summary>
 68         [Description("显示字段"), Category("Data")]
 69         public string DisplayFiled
 70         {
 71             get;
 72             set;
 73         }
 74         /// <summary>
 75         /// 值字段
 76         /// </summary>
 77         [Description("值字段"), Category("Data")]
 78         public string ValueFiled
 79         {
 80             get;
 81             set;
 82         }
 83         #endregion
 84 
 85      
 86         public void DataBind()
 87         {
 88             this.BeginUpdate();
 89             if (DataSource != null)
 90             {
 91                 if (DataSource is IDataReader)
 92                 {
 93                     DataTable dataTable = new DataTable();
 94                     dataTable.Load(DataSource as IDataReader);
 95 
 96                     DataBindToDataTable(dataTable);
 97                 }
 98                 else if (DataSource is DataView || DataSource is DataSet || DataSource is DataTable)
 99                 {
100                     DataTable dataTable = null;
101 
102                     if (DataSource is DataView)
103                     {
104                         dataTable = ((DataView)DataSource).ToTable();
105                     }
106                     else if (DataSource is DataSet)
107                     {
108                         dataTable = ((DataSet)DataSource).Tables[0];
109                     }
110                     else
111                     {
112                         dataTable = ((DataTable)DataSource);
113                     }
114 
115                     DataBindToDataTable(dataTable);
116                 }
117                 else if (DataSource is IEnumerable)
118                 {
119                     DataBindToEnumerable((IEnumerable)DataSource);
120                 }
121                 else
122                 {
123                     throw new Exception("DataSource doesn't support data type: " + DataSource.GetType().ToString());
124                 }
125             }
126             else
127             {
128                 lst.Nodes.Clear();
129             }
130 
131             lst.ItemHeight = this.ItemHeight;
132             lst.BorderStyle = BorderStyle.FixedSingle;
133             lst.Size = new Size(this.DropDownWidth, this.ItemHeight * (this.MaxDropDownItems - 1) - (int)this.ItemHeight / 2);
134             lst.Location = new Point(this.Left, this.Top + this.ItemHeight + 6);
135             this.Parent.Controls.Add(lst);
136             lst.Hide();
137             this.EndUpdate();
138         }
139 
140     
141         private void DataBindToDataTable(DataTable dt)
142         {
143             foreach (DataRow dr in dt.Rows)
144             {
145                 TreeNode tn = new TreeNode();
146                 if (!string.IsNullOrEmpty(DisplayFiled) && !string.IsNullOrEmpty(ValueFiled))
147                 {
148                     tn.Text = dr[DisplayFiled].ToString();
149                     tn.Tag = dr[ValueFiled].ToString();
150                 }
151                 else if (string.IsNullOrEmpty(ValueFiled))
152                 {
153                     tn.Text = dr[DisplayFiled].ToString();
154                     tn.Tag = dr[DisplayFiled].ToString();
155                 }
156                 else if (string.IsNullOrEmpty(DisplayFiled))
157                 {
158                     tn.Text = dr[ValueFiled].ToString();
159                     tn.Tag = dr[ValueFiled].ToString();
160                 }
161                 else
162                 {
163                     throw new Exception("ValueFiled和DisplayFiled至少保证有一项有值");
164                 }
165 
166                 tn.Checked = false;
167                 lst.Nodes.Add(tn);
168             }
169         }
170 
171         /// <summary>
172         /// 绑定到可枚举类型
173         /// </summary>
174         /// <param name="enumerable">可枚举类型</param>
175         private void DataBindToEnumerable(IEnumerable enumerable)
176         {
177             IEnumerator enumerator = enumerable.GetEnumerator();
178             while (enumerator.MoveNext())
179             {
180                 object currentObject = enumerator.Current;
181                 lst.Nodes.Add(CreateListItem(currentObject));
182             }
183         }
184 
185 
186      
187         private TreeNode CreateListItem(Object obj)
188         {
189             TreeNode item = new TreeNode();
190 
191             if (obj is string)
192             {
193                 item.Text = obj.ToString();
194                 item.Tag = obj.ToString();
195             }
196             else
197             {
198                 if (DisplayFiled != "")
199                 {
200                     item.Text = GetPropertyValue(obj, DisplayFiled);
201                 }
202                 else
203                 {
204                     item.Text = obj.ToString();
205                 }
206 
207                 if (ValueFiled != "")
208                 {
209                     item.Tag = GetPropertyValue(obj, ValueFiled);
210                 }
211                 else
212                 {
213                     item.Tag = obj.ToString();
214                 }
215             }
216             return item;
217         }
218 
219    
220         private string GetPropertyValue(object obj, string propertyName)
221         {
222             object result = null;
223 
224             result = ObjectUtil.GetPropertyValue(obj, propertyName);
225             return result == null ? String.Empty : result.ToString();
226         }
227 
228         #region override
229 
230    
231         protected override void OnKeyUp(KeyEventArgs e)
232         {
233             base.OnKeyDown(e);
234             bool Pressed = (e.Control && ((e.KeyData & Keys.A) == Keys.A));
235             if (Pressed)
236             {
237                 this.Text = "";
238                 for (int i = 0; i < lst.Nodes.Count; i++)
239                 {
240                     lst.Nodes[i].Checked = true;
241                     if (this.Text != "")
242                     {
243                         this.Text += ",";
244                     }
245                     this.Text += lst.Nodes[i].Tag;
246                 }
247             }
248         }
249       
250         protected override void OnMouseDown(MouseEventArgs e)
251         {
252             this.DroppedDown = false;
253 
254         }
255       
256         protected override void OnMouseUp(MouseEventArgs e)
257         {
258             this.DroppedDown = false;
259             lst.Focus();
260         }
261        
262         protected override void OnDropDown(EventArgs e)
263         {
264             string strValue = this.Text;
265             if (!string.IsNullOrEmpty(strValue))
266             {
267                 List<string> lstvalues = strValue.Split(',').ToList<string>();
268                 foreach (TreeNode tn in lst.Nodes)
269                 {
270                     if (tn.Checked && !lstvalues.Contains(tn.Tag.ToString()) && !string.IsNullOrEmpty(tn.Tag.ToString().Trim()))
271                     {
272                         tn.Checked = false;
273                     }
274                     else if (!tn.Checked && lstvalues.Contains(tn.Tag.ToString()) && !string.IsNullOrEmpty(tn.Tag.ToString().Trim()))
275                     {
276                         tn.Checked = true;
277                     }
278                 }
279             }
280 
281             lst.Show();
282 
283         }
284         #endregion
285      
286         private void lst_KeyUp(object sender, KeyEventArgs e)
287         {
288             this.OnKeyUp(e);
289         }
290       
291         private void lst_MouseUp(object sender, MouseEventArgs e)
292         {
293             try
294             {
295                 this.Text = "";
296                 for (int i = 0; i < lst.Nodes.Count; i++)
297                 {
298                     if (lst.Nodes[i].Checked)
299                     {
300                         if (this.Text != "")
301                         {
302                             this.Text += ",";
303                         }
304                         this.Text += lst.Nodes[i].Tag;
305                     }
306                 }
307             }
308             catch
309             {
310                 this.Text = "";
311             }
312             bool isControlPressed = (Control.ModifierKeys == Keys.Control);
313             bool isShiftPressed = (Control.ModifierKeys == Keys.Shift);
314             if (isControlPressed || isShiftPressed)
315                 lst.Show();
316             else
317                 lst.Hide();
318         }
319 
320     }
321 
322 
323     /// <summary>
324     /// 对象帮助类
325     /// </summary>
326     public class ObjectUtil
327     {
328         /// <summary>
329         /// 获取对象的属性值
330         /// </summary>
331         /// <param name="obj">可能是DataRowView或一个对象</param>
332         /// <param name="propertyName">属性名</param>
333         /// <returns>属性值</returns>
334         public static object GetPropertyValue(object obj, string propertyName)
335         {
336             object result = null;
337 
338             try
339             {
340                 if (obj is DataRow)
341                 {
342                     result = (obj as DataRow)[propertyName];
343                 }
344                 else if (obj is DataRowView)
345                 {
346                     result = (obj as DataRowView)[propertyName];
347                 }
348                 else if (obj is JObject)
349                 {
350                     result = (obj as JObject).Value<JValue>(propertyName).Value; //.getValue(propertyName);
351                 }
352                 else
353                 {
354                     result = GetPropertyValueFormObject(obj, propertyName);
355                 }
356             }
357             catch (Exception)
358             {
359                 // 找不到此属性
360             }
361 
362             return result;
363         }
364 
365         /// <summary>
366         /// 获取对象的属性值
367         /// </summary>
368         /// <param name="obj">对象</param>
369         /// <param name="propertyName">属性名("Color"、"BodyStyle"或者"Info.UserName")</param>
370         /// <returns>属性值</returns>
371         private static object GetPropertyValueFormObject(object obj, string propertyName)
372         {
373             object rowObj = obj;
374             object result = null;
375 
376             if (propertyName.IndexOf(".") > 0)
377             {
378                 string[] properties = propertyName.Split('.');
379                 object tmpObj = rowObj;
380 
381                 for (int i = 0; i < properties.Length; i++)
382                 {
383                     PropertyInfo property = tmpObj.GetType().GetProperty(properties[i], BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
384                     if (property != null)
385                     {
386                         tmpObj = property.GetValue(tmpObj, null);
387                     }
388                 }
389 
390                 result = tmpObj;
391             }
392             else
393             {
394                 PropertyInfo property = rowObj.GetType().GetProperty(propertyName, BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
395                 if (property != null)
396                 {
397                     result = property.GetValue(rowObj, null);
398                 }
399             }
400 
401             return result;
402         }
403     }
404 }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-01-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档