将继承的属性隐藏在 PropertyGrid 中






4.62/5 (21投票s)
两种从 PropertyGrid 隐藏从基控件继承的属性的技术。
引言
创建控件时,通常从提供一些基本功能的最低通用基控件开始。然而,有时你开始使用的控件可能会向 PropertyGrid
呈现你不想在新控件的 Designer 中公开的属性,因为它们可能不再相关。在这里,我们解释了隐藏这些你可能觉得有用的属性的两种方法。
从 PropertyGrid 隐藏属性
要从 PropertyGrid
隐藏属性很简单,你只需要使用 BrowsableAttribute
并将其值设置为 false
。
[Browsable(false)]
public int AnIntegerProperty
{
get
{
...
}
set
{
...
}
}
因此,要隐藏一个继承的属性,你只需要封装该属性并添加该属性。
[Browsable(false)]
public override string Text
{
get
{
...
}
set
{
...
}
}
有时你会发现你可能需要根据具体情况添加 virtual
或 new
关键字。这是一种简单的方法,然而你所做的只是添加了不必要的代码,以便让 PropertyGrid
显示你想要显示的内容。
另一种方法
当你创建一个控件时,通常的做法是将一个设计器与该控件关联起来,使用设计器可以让你将控件的设计时功能与运行时功能分开。一个设计器有一个名为 PreFilterProperties
的重写方法,该方法可以用于向 PropertyGrid
提取的集合中添加额外的属性。
using System.ComponentModel;
[ToolboxData("<{0}:MyControl runat=server></{0}:MyControl>"),
Designer(typeof(MyControlDesigner))]
public class MyControl : ...
{
...
}
public class MyControlDesigner : ...
{
...
protected override void PreFilterProperties(
IDictionary properties)
{
base.PreFilterProperties (properties);
string[] propertiesToHide =
{"MyProperty", "ErrorMessage"};
foreach(string propname in propertiesToHide)
{
prop =
(PropertyDescriptor)properties[propname];
if(prop!=null)
{
AttributeCollection runtimeAttributes =
prop.Attributes;
// make a copy of the original attributes
// but make room for one extra attribute
Attribute[] attrs =
new Attribute[runtimeAttributes.Count + 1];
runtimeAttributes.CopyTo(attrs, 0);
attrs[runtimeAttributes.Count] =
new BrowsableAttribute(false);
prop =
TypeDescriptor.CreateProperty(this.GetType(),
propname, prop.PropertyType,attrs);
properties[propname] = prop;
}
}
}
}
通过将你希望隐藏的属性名称添加到集合 propertiesToHide
中,你现在有了一种快速简便的方法来隐藏属性,而无需编写大量不必要的代码。稍加努力,你可以将此代码添加到基本设计器类中,并将其添加到所有需要它的控件中。
已知问题
已经注意到,以这种方式操作某些属性可能会在编辑控件时引起问题。如果你遇到问题,你可以使用第一个解决方案来隐藏属性,例如在使用基于 BaseValidator
的控件时使用的 Text
属性。目前仍在调查是否总是 Text
属性,或者是否有其他问题导致行为异常。
注释
请花时间为这篇文章投票和/或在下面的留言板上评论。所有改进建议都将被考虑。
历史
- 2005年8月22日 - v1
- 2005年8月25日 - v1.1 - 添加了已知问题。