65.9K
CodeProject 正在变化。 阅读更多。
Home

将继承的属性隐藏在 PropertyGrid 中

2005 年 8 月 22 日

CPOL

2分钟阅读

viewsIcon

131567

两种从 PropertyGrid 隐藏从基控件继承的属性的技术。

引言

创建控件时,通常从提供一些基本功能的最低通用基控件开始。然而,有时你开始使用的控件可能会向 PropertyGrid 呈现你不想在新控件的 Designer 中公开的属性,因为它们可能不再相关。在这里,我们解释了隐藏这些你可能觉得有用的属性的两种方法。

从 PropertyGrid 隐藏属性

要从 PropertyGrid 隐藏属性很简单,你只需要使用 BrowsableAttribute 并将其值设置为 false

[Browsable(false)]
public int AnIntegerProperty
{
    get
    {
        ...
    }
    set
    {
        ...
    }
}

因此,要隐藏一个继承的属性,你只需要封装该属性并添加该属性。

[Browsable(false)]
public override string Text
{
    get
    {
        ...
    }
    set
    {
        ...
    }
}

有时你会发现你可能需要根据具体情况添加 virtualnew 关键字。这是一种简单的方法,然而你所做的只是添加了不必要的代码,以便让 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 - 添加了已知问题。
© . All rights reserved.