Introduction Hope you are familiar with Windows PropertyGrid control. I had used this control long time back, but I couldn't get a chance to work with dynamic properties. I thought there will be some methods like GridName.Items.Add() to add items at runtime. But, I had to write some lines of code to accomplish the same. My requirement was simple: I want to display all properties of my object in PropertyGrid, but I don't know the name of properties at design time. I have used CollectionBase, ICustomTypeDescriptor and PropertyDescriptor classes to accomplish the same. Custom Property First, I created one CustomProperty class with the following public properties: - Name
- Value
- ReadOnly
- Visible
The constructor looks like this: public CustomProperty(string sName, object value, bool bReadOnly, bool bVisible ) { this.sName = sName; this.objValue = value; this.bReadOnly = bReadOnly; this.bVisible = bVisible; } Custom PropertyDescriptor Next step is to create a PropertyDescriptor for my class. Derived CustomPropertyDescriptorPropertyDescriptor class. from public class CustomPropertyDescriptor: PropertyDescriptor { CustomProperty m_Property; public CustomPropertyDescriptor(ref CustomProperty myProperty, Attribute [] attrs) :base(myProperty.Name, attrs) { m_Property = myProperty; } ..... We have to override all methods of PropertyDescriptor since it is an abstract class. Custom Class We will be creating object of this CustomClass for PropertyGrid.SelectedObject. public class CustomClass: CollectionBase,ICustomTypeDescriptor { public void Add(CustomProperty Value) { base.List.Add(Value); } public void Remove(string Name) { foreach(CustomProperty prop in base.List) { if(prop.Name == Name) { base.List.Remove(prop); return; } } } public CustomProperty this[int index] { get { return (CustomProperty)base.List[index]; } set { base.List[index] = (CustomProperty)value; } } ....... Here is the most important method GetProperties, which will called while binding object to PropertyGrid. public PropertyDescriptorCollection GetProperties(Attribute[] attributes) { PropertyDescriptor[] newProps = new PropertyDescriptor[this.Count]; for (int i = 0; i < this.Count; i++) { CustomProperty prop = (CustomProperty) this[i]; newProps[i] = new CustomPropertyDescriptor(ref prop, attributes); } return new PropertyDescriptorCollection(newProps); } How to use CustomClass CustomClass can be used in any Windows Form having PropertyGrid. CustomClass myProperties = new CustomClass(); propertyGrid1.SelectedObject = myProperties; ......
CustomProperty myProp = new CustomProperty(txtName.Text,txtValue.Text, chkReadOnly.Checked,true); myProperties.Add(myProp); propertyGrid1.Refresh(); Finally I hope users can extend my CustomClass and use PropertyGrid control with dynamic properties.
|