Skip to main content
Email Password   helpLost your password?

Sample Image - Dynamic_Propertygrid.jpg

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:

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 CustomPropertyDescriptor from PropertyDescriptor class.

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.

You must Sign In to use this message board.
 
 
Per page   
 FirstPrevNext
GeneralLabview can use PropertyGrid thanks to your code Pin
pcncottin
19:11 30 Jul '08  
QuestionDatatype sensitve properties Pin
harish_somanchi
11:05 22 Mar '07  
GeneralThere is a small bug inside the code Pin
alp ates
5:04 26 Dec '06  
GeneralType Pin
Lions_italy
22:28 16 Jan '06  
GeneralIs it possible to change [Readonly( )] attribute at runtime? Pin
jjohn2005
23:13 6 Dec '05  
AnswerRe: Is it possible to change [Readonly( )] attribute at runtime? Pin
Locusta74
19:40 11 Feb '07  
GeneralLook a little further Pin
ByteGhost
12:38 28 Feb '05  
GeneralDynamic list property Pin
Poletto
23:23 30 Jan '05  
GeneralRe: Dynamic list property Pin
salle78
3:27 24 Nov '08  
GeneralAttributes Pin
damslang
23:25 24 Jan '05  
GeneralRe: Attributes Pin
damslang
0:30 25 Jan '05  
GeneralExtending dynamic propertygrid capabilities Pin
Poletto
22:56 24 Jan '05  
GeneralRe: Extending dynamic propertygrid capabilities Pin
varad27
22:20 3 Sep '07  


Last Updated 12 Jan 2005 | Advertise | Privacy | Terms of Use | Copyright © CodeProject, 1999-2009