【转载】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; }

效果如图:

image

 

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;        }    }
posted @ 2025-12-15 18:59  家煜宝宝  阅读(10)  评论(0)    收藏  举报