c# Winform PropertyGrid 实现下拉框 多选

匿名 (未验证) 提交于 2019-12-02 23:32:01

 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,操作更方便哦

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!