c# Winform PropertyGrid 实现下拉框 多选
Posted aaaaq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
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 }
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 }
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 }
源码分享
链接:https://pan.baidu.com/s/1e8D-WoTYmA-D7vm88TTQrA
提取码:bdrd
复制这段内容后打开百度网盘手机App,操作更方便哦
以上是关于c# Winform PropertyGrid 实现下拉框 多选的主要内容,如果未能解决你的问题,请参考以下文章
C#:更新时 PropertyGrid 不调用属性`Get`方法
WinForm小白的WPF初试一:从PropertyGrid控件,输出内容到Word(上)
C# 属性控件(propertyGrid),如何动态添加下拉框中的值。例如:Name : 下拉框中的值:小米,小明。