c# Winform PropertyGrid 实现下拉框 多选

 1 using PropertyGridHelpers.Controls;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.ComponentModel;
 5 using System.Drawing.Design;
 6 using System.Windows.Forms;
 7 using System.Windows.Forms.Design;
 8 
 9 namespace PropertyGridHelpers.UIEditors
10 {
11 
12     public class FlagEnumUIEditor : UITypeEditor
13     {
14         private CheckedListBoxEx check;
15 
16         public FlagEnumUIEditor()
17         {
18             check = new CheckedListBoxEx();
19             check.BorderStyle = BorderStyle.None;
20         }
21 
22         public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
23         {
24             if (context != null && context.Instance != null && provider != null)
25             {
26                 IWindowsFormsEditorService service = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
27                 if (service != null)
28                 {
29                     List<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>();
30                     for (int i = 0; i < 100; i++)
31                     {
32                         list.Add(new KeyValuePair<string, string>(i.ToString(), Guid.NewGuid().ToString("N")));
33                     }
34                     check.DataSource = list;
35                     service.DropDownControl(check);
36                     return check.GetSelectItemValueText;
37                 }
38             }
39             return null;
40         }
41 
42         public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
43         {
44             return UITypeEditorEditStyle.DropDown;
45         }
46     }
47 }
FlagEnumUIEditor
  1 using System;
  2 using System.ComponentModel;
  3 using System.Windows.Forms;
  4 using System.Collections.Generic;
  5 using System.Linq;
  6 
  7 namespace PropertyGridHelpers.Controls
  8 {
  9 
 10     public class CheckedListBoxEx : CheckedListBox
 11     {
 12         private Container components = null;
 13         public CheckedListBoxEx()
 14         {
 15             InitializeComponent();
 16         }
 17         protected override void Dispose(bool disposing)
 18         {
 19             if (disposing)
 20             {
 21                 if (components != null)
 22                     components.Dispose();
 23             }
 24             base.Dispose(disposing);
 25         }
 26 
 27         #region Component Designer generated code
 28 
 29         private void InitializeComponent()
 30         {
 31             this.CheckOnClick = true;
 32         }
 33         protected override void OnItemCheck(ItemCheckEventArgs e)
 34         {
 35             base.OnItemCheck(e);
 36         }
 37         #endregion
 38 
 39         #region Add
 40         public CheckItem Add(string code, string value)
 41         {
 42             CheckItem item = new CheckItem(code, value);
 43             Items.Add(item);
 44             return item;
 45         }
 46         public CheckItem Add(CheckItem item)
 47         {
 48             Items.Add(item);
 49             return item;
 50         }
 51         #endregion
 52         #region 获取选择值
 53         public string GetSelectItemValueText { get { return string.Join(",", GetSelectItemAll.Select(n => n.Value)); } }
 54         public string GetSelectItemKeyText { get { return string.Join(",", GetSelectItemAll.Select(n => n.Key)); } }
 55         public List<KeyValuePair<string, string>> GetSelectItemAll
 56         {
 57             get
 58             {
 59                 List<KeyValuePair<string, string>> list = new List<KeyValuePair<string, string>>();
 60                 for (int i = 0; i < Items.Count; i++)
 61                 {
 62                     CheckItem item = Items[i] as CheckItem;
 63                     if (GetItemChecked(i))
 64                     {
 65                         list.Add(new KeyValuePair<string, string>(item.Code, item.Value));
 66                     }
 67                 }
 68                 return list;
 69             }
 70         }
 71         #endregion
 72         private object data;
 73         /// <summary>
 74         /// 绑定数据源
 75         /// </summary>
 76         /// <param name="data"></param>
 77         public new object DataSource
 78         {
 79             get
 80             {
 81                 return data;
 82             }
 83             set
 84             {
 85                 data = value;
 86                 if (data is IEnumerable<KeyValuePair<string, string>>)
 87                 {
 88                     foreach (KeyValuePair<string, string> item in (data as IEnumerable<KeyValuePair<string, string>>))
 89                     {
 90                         Add(item.Key, item.Value);
 91                     }
 92                 }
 93                 else if (data is IEnumerable<CheckItem>)
 94                 {
 95                     foreach (CheckItem item in (data as IEnumerable<CheckItem>))
 96                     {
 97                         Add(item);
 98                     }
 99                 }
100             }
101         }
102 
103     }
104 }
CheckedListBoxEx
 1 namespace PropertyGridHelpers.Controls
 2 {
 3     /// <summary>
 4     /// Represents an item in the checklistbox
 5     /// </summary>
 6     public class CheckItem
 7     {
 8         public string Value;
 9         public string Code;
10         public CheckItem(string code, string value)
11         {
12             this.Value = value;
13             this.Code = code;
14         }
15         public override string ToString()
16         {
17             return Value;
18         }
19     }
20 
21 }
CheckItem
 1 using PropertyGridHelpers.UIEditors;
 2 using System.ComponentModel;
 3 using System.Windows.Forms;
 4 
 5 namespace WindowsFormsApplication1
 6 {
 7     public partial class Form1 : Form
 8     {
 9         public Form1()
10         {
11             InitializeComponent();
12             propertyGrid1.SelectedObject = new PropertyList(); ;
13         }
14     }
15     class PropertyList
16     {
17         string m_dir;
18         [EditorAttribute(typeof(FlagEnumUIEditor), typeof(System.Drawing.Design.UITypeEditor))]
19         [DisplayName("Direction")]
20         [Description("Direction property")]
21         public string Dir
22         {
23             get
24             {
25                 return m_dir;
26             }
27             set
28             {
29                 m_dir = value;
30             }
31         }
32     }
33  
34 }
Form1

源码分享  

链接:https://pan.baidu.com/s/1e8D-WoTYmA-D7vm88TTQrA
提取码:bdrd
复制这段内容后打开百度网盘手机App,操作更方便哦

猜你喜欢

转载自www.cnblogs.com/aaaaq/p/10802083.html