Visual Studio .NET 2003Windows 2003.NET 1.1Visual Studio 2005Windows 2000Windows XP.NET 2.0中级开发Visual StudioWindows.NETC#
在运行时向 PropertyGrid 添加(删除)项






4.79/5 (46投票s)
2005年1月12日
1分钟阅读

199028

6049
在运行时修改 PropertyGrid 控件的项目集合。
引言
希望您熟悉 Windows PropertyGrid
控件。我很久以前使用过这个控件,但没有机会处理动态属性。我以为会有一些像 GridName.Items.Add()
这样的方法可以在运行时添加项目。但是,我不得不编写一些代码来实现相同的功能。我的需求很简单:我想在 PropertyGrid
中显示我的对象的全部属性,但我不知道设计时属性的名称。我使用了 CollectionBase
、ICustomTypeDescriptor
和 PropertyDescriptor
类来实现相同的功能。
自定义属性
首先,我创建了一个具有以下公共属性的 CustomProperty
类
名称
值
ReadOnly
Visible
构造函数如下所示
public CustomProperty(string sName,
object value, bool bReadOnly, bool bVisible )
{
this.sName = sName;
this.objValue = value;
this.bReadOnly = bReadOnly;
this.bVisible = bVisible;
}
自定义 PropertyDescriptor
下一步是为我的类创建一个 PropertyDescriptor
。从 PropertyDescriptor
类派生 CustomPropertyDescriptor
。
public class CustomPropertyDescriptor: PropertyDescriptor
{
CustomProperty m_Property;
public CustomPropertyDescriptor(ref CustomProperty myProperty,
Attribute [] attrs) :base(myProperty.Name, attrs)
{
m_Property = myProperty;
}
.....
由于它是一个抽象类,我们必须重写 PropertyDescriptor
的所有方法。
自定义类
我们将创建此 CustomClass
的对象,用于 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;
}
}
.......
这里是最重要的方法 GetProperties
,它将在将对象绑定到 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);
}
如何使用 CustomClass
CustomClass
可以在任何具有 PropertyGrid
的 Windows 窗体中使用。
CustomClass myProperties = new CustomClass();
propertyGrid1.SelectedObject = myProperties;
......
CustomProperty myProp = new CustomProperty(txtName.Text,txtValue.Text,
chkReadOnly.Checked,true);
myProperties.Add(myProp);
propertyGrid1.Refresh();
最后
我希望用户能够扩展我的 CustomClass
并使用 PropertyGrid
控件处理动态属性。