【转载】C# PropertyGrid使用总结
1. 只有public的property能显示出来,可以通过BrowsableAttribute来控制是否显示,通过CategoryAttribute设置分类,通过DescriptionAttribute设置描述,Attribute可以加在Class上,也可以加在属性上,属性上的Attribute优先级更高;
2. enum会自动使用列表框表示;
3. 自带输入有效性检查,如int类型输入double数值,会弹出提示对话框;
4. 基本类型Array:增加删除只能通过弹出的集合编辑器,修改可以直接展开,值为null时,可以通过集合编辑器创建;
5. 基本类型List:增删改都只能通过集合编辑器,值为null时,能打开集合编辑器,但不能保存结果,所以必须初始化;
6. ReadOnlyAttribute设置为true时,显示为灰色;对List无效,可以打开集合编辑器,在集合编辑器内可以进行增删改;应用于Array时,不能打开集合编辑器,即不能增删,但可以通过展开的方式修改Array元素;
7. 对象:值显示Object.ToString();Class上加了[TypeConverter(typeof(ExpandableObjectConverter))]之后(也可以加在属性上),才能展开编辑,否则显示为灰色只读;不初始化什么也干不了;
8. 基类类型派生类对象:与普通对象没有区别,[TypeConverter(typeof(ExpandableObjectConverter))]加在基类上即可;
9. 对象Array:增加删除只能通过弹出的集合编辑器,修改可以直接展开,值为null时,可以通过集合编辑器创建;
10. 对象List:增加删除修改只能通过弹出的集合编辑器,值为null时,能打开集合编辑器,但不能保存结果,所以必须初始化;
11. Hashtable和Dictionary能打开集合编辑器,但不能编辑;
12. 通过MyDoubleConverter实现Double类型只显示小数点后两位:
1 public class MyDoubleConverter : DoubleConverter 2 { 3 public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) 4 { 5 if (destinationType == typeof(string)) 6 { 7 return string.Format("{0:0.00}", value); 8 } 9 return base.ConvertTo(context, culture, value, destinationType); 10 } 11 }
13. 通过TypeConverter实现用字符串表示对象
1 [TypeConverter(typeof(StudentConverter))] 2 public class Student 3 { 4 public Student(string name, int age) 5 { 6 Name = name; 7 Age = age; 8 } 9 public string Name { get; set; } 10 public int Age { get; set; } 11 12 public static Student FromString(string s) 13 { 14 string name = "Default"; 15 int age = 0; 16 string[] splits = s.Split(','); 17 if (splits.Length == 2) 18 { 19 name = splits[0]; 20 int.TryParse(splits[1], out age); 21 } 22 return new Student(name, age); 23 } 24 25 public override string ToString() 26 { 27 return string.Format("{0},{1}", Name, Age); 28 } 29 } 30 31 public class StudentConverter : TypeConverter 32 { 33 public override bool CanConvertFrom(System.ComponentModel.ITypeDescriptorContext context, Type sourceType) 34 { 35 if (sourceType == typeof(string)) 36 { 37 return true; 38 } 39 return base.CanConvertFrom(context, sourceType); 40 } 41 public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value) 42 { 43 Student result = null; 44 if ((value as string) != null) 45 { 46 result = Student.FromString(value as string); 47 } 48 return result; 49 } 50 public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) 51 { 52 if (destinationType == typeof(string)) 53 { 54 return true; 55 } 56 return base.CanConvertTo(context, destinationType); 57 } 58 public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType) 59 { 60 if (destinationType == typeof(string)) 61 { 62 return value.ToString(); 63 } 64 return base.ConvertTo(context, culture, value, destinationType); 65 } 66 }
14. 使用UITypeEditor实现文件或目录选择
1 // 需要在项目里添加引用:程序集|框架|System.Design 2 [Editor(typeof(FileNameEditor), typeof(UITypeEditor))] 3 public string FileName { get; set; } 4 5 [Editor(typeof(FolderNameEditor), typeof(UITypeEditor))] 6 public string FolderName { get; set; }
15. 使用自定义的下拉式编辑界面
1 public class MyAddress 2 { 3 public string Province { get; set; } 4 public string City { get; set; } 5 public override string ToString() 6 { 7 return string.Format("{0}-{1}", Province, City); 8 } 9 } 10 11 public class MyAddressEditor : UITypeEditor 12 { 13 public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 14 { 15 return UITypeEditorEditStyle.DropDown; 16 } 17 18 public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 19 { 20 IWindowsFormsEditorService service = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService; 21 if (service != null) 22 { 23 service.DropDownControl(new MyEditorControl(value as MyAddress)); 24 } 25 return value; 26 } 27 } 28 29 // 实现两个ComboBox用来编辑MyAddress的属性 30 public partial class MyEditorControl : UserControl 31 { 32 private MyAddress _address; 33 public MyEditorControl(MyAddress address) 34 { 35 InitializeComponent(); 36 _address = address; 37 comboBoxProvince.Text = _address.Province; 38 comboBoxCity.Text = _address.City; 39 } 40 41 private void comboBoxProvince_SelectedIndexChanged(object sender, EventArgs e) 42 { 43 _address.Province = comboBoxProvince.Text; 44 } 45 46 private void comboBoxCity_SelectedIndexChanged(object sender, EventArgs e) 47 { 48 _address.City = comboBoxCity.Text; 49 } 50 } 51 52 // MyAddress属性声明 53 [Editor(typeof(MyAddressEditor), typeof(UITypeEditor))] 54 public MyAddress Address { get; set; }
效果如图:

16. 实现弹出式编辑对话框,只要将UserControl改成Form,EditStyle改成Modal,service.DropDownControl改成service.ShowDialog
1 public partial class MyEditorForm : Form 2 { 3 private MyAddress _address; 4 public MyEditorForm(MyAddress address) 5 { 6 InitializeComponent(); 7 _address = address; 8 comboBoxProvince.Text = _address.Province; 9 comboBoxCity.Text = _address.City; 10 } 11 12 private void comboBoxProvince_SelectedIndexChanged(object sender, EventArgs e) 13 { 14 _address.Province = comboBoxProvince.Text; 15 } 16 17 private void comboBoxCity_SelectedIndexChanged(object sender, EventArgs e) 18 { 19 _address.City = comboBoxCity.Text; 20 } 21 } 22 23 public class MyAddressEditor : UITypeEditor 24 { 25 public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 26 { 27 return UITypeEditorEditStyle.Modal; 28 } 29 30 public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 31 { 32 IWindowsFormsEditorService service = provider.GetService(typeof(IWindowsFormsEditorService)) as IWindowsFormsEditorService; 33 if (service != null) 34 { 35 service.ShowDialog(new MyEditorForm(value as MyAddress)); 36 } 37 return value; 38 } 39 }
17. 密码表示:[PasswordPropertyText(true)]
18. 动态显示/隐藏属性
1 class MyData 2 { 3 public static void SetPropertyAttribute(object obj, string propertyName, Type attrType, string attrField, object value) 4 { 5 PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj); 6 Attribute attr = props[propertyName].Attributes[attrType]; 7 FieldInfo field = attrType.GetField(attrField, BindingFlags.Instance | BindingFlags.NonPublic); 8 field.SetValue(attr, value); 9 } 10 11 private bool _ShowPassword = false; 12 public bool ShowPassword 13 { 14 get { return _ShowPassword; } 15 set 16 { 17 _ShowPassword = value; 18 SetPropertyAttribute(this, "Password", typeof(BrowsableAttribute), "browsable", _ShowPassword); 19 } 20 } 21 22 [PasswordPropertyText(true)] 23 [Browsable(true)] 24 public string Password { get; set; } 25 } 26 27 public partial class MainFrm : Form 28 { 29 // 不添加PropertyValueChanged事件,不能实现动态显示/隐藏 30 private void myData_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) 31 { 32 this.myData.SelectedObject = this.myData.SelectedObject; 33 } 34 }
19. 提供下拉选项的string
1 public class ListStringConverter : StringConverter 2 { 3 public override bool GetStandardValuesSupported(ITypeDescriptorContext context) 4 { 5 return true; 6 } 7 8 public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context) 9 { 10 return new StandardValuesCollection(new string[] { "A", "B" }); 11 } 12 13 public override bool GetStandardValuesExclusive(ITypeDescriptorContext context) 14 { 15 return false; 16 } 17 } 18 19 [TypeConverter(typeof(ListStringConverter))] 20 public string Name { get; set; }
转载自:https://www.cnblogs.com/zhuyingchun/p/8474406.html
class MyData { public static void SetPropertyAttribute(object obj, string propertyName, Type attrType, string attrField, object value) { PropertyDescriptorCollection props = TypeDescriptor.GetProperties(obj); Attribute attr = props[propertyName].Attributes[attrType]; FieldInfo field = attrType.GetField(attrField, BindingFlags.Instance | BindingFlags.NonPublic); field.SetValue(attr, value); }private bool _ShowPassword = false; public bool ShowPassword { get { return _ShowPassword; } set { _ShowPassword = value; SetPropertyAttribute(this, "Password", typeof(BrowsableAttribute), "browsable", _ShowPassword); } }
[PasswordPropertyText(true)] [Browsable(true)] public string Password { get; set; } }
public partial class MainFrm : Form { // 不添加PropertyValueChanged事件,不能实现动态显示/隐藏 private void myData_PropertyValueChanged(object s, PropertyValueChangedEventArgs e) { this.myData.SelectedObject = this.myData.SelectedObject; } }

浙公网安备 33010602011771号