3

使用

<System.ComponentModel.TypeConverter(GetType(System.ComponentModel.ExpandableObjectConverter))> _

关于由数字属性组成的类(它是另一个类的属性)的声明。

我简单地加载这个类的一个实例......

PropertyGrid1.SelectedObject = oColumn

显然我不想在代码中手动构建 propertygrid,我知道该怎么做。

但这就是问题所在。根据属性的值,某些其他属性不应该是可见的,就好像我使用了

<System.ComponentModel.Browsable(False)> _

属性声明上的属性。

无论如何以编程方式执行此操作,而无需手动处理属性网格的所有构建>

4

4 回答 4

16

其实这完全有可能。第一种也是最简单的方法是设置网格的 BrowsableAttributes 属性:

propGraph.BrowsableAttributes = new AttributeCollection(
    new Attribute[] 
    { 
        new CategoryAttribute("Appearance")
    });

这将过滤掉所有与您提供的属性类型不匹配的属性。不幸的是,这是一个积极的过滤器,而不是一个消极的过滤器,这使得它不太有用恕我直言。

其次,同样容易,您可以在要在 PropertyGrid 中显示的对象周围创建一个简单的包装器,然后重新定义要隐藏/等的任何属性。作为直通属性:

public class MyDerivedControl : public TextBox
{
    [Browsable(false)]
    [Category("MyCustomCategory")]
    public new bool Enabled
    {
         get { return base.Enabled }
         set { base.Enabled = value; }
    }
}

将其弹出到属性网格中,启用属性将被隐藏。

第三,您可以自定义 PropertyGrid 本身并进入类型描述符的世界等等,但如果您只想隐藏几个属性,那就太矫枉过正了。

希望这可以帮助。

于 2009-07-31T01:40:02.007 回答
1

如果您希望使用 gridItem.Hide() 那么答案是否定的。在 MS PropertyGrid 中实现这一点的唯一方法是通过 TypeConverter 或自定义类型描述符(实现 ICustomTypeDescriptor)的 GetProperties 方法动态发布您的属性。我会先尝试使用 TypeConverter(特别是如果您要检查的属性值处于同一级别),需要做的编码更少。

于 2009-03-10T14:22:21.410 回答
0

至于 C++,这是一个简单的解决方案,可以在propertyGrid.

cli::array<Attribute^,1>^ attrs = {gcnew CategoryAttribute("Appearance")};
this->PropertyGrid->BrowsableAttributes = gcnew AttributeCollection(attrs);
this->PropertyGrid->SelectedObject = this->SelectedControl;

这将仅在 propertyGrid 中显示“外观”类别并隐藏所有其他类别。假设您可以自己翻译 C# 中的代码。

于 2013-04-17T09:37:22.680 回答
-2

这个问题类似,但答案更完整。有些人可能希望交叉引用。

于 2010-07-15T21:35:31.417 回答