使用

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

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

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

PropertyGrid1.SelectedObject = oColumn

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

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

一样
<System.ComponentModel.Browsable(False)> _
属性声明的

属性。

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

有帮助吗?

解决方案

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

其他提示

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

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

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

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

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

将其弹出到属性网格中,将隐藏Enabled属性。

第三,你可以自定义PropertyGrid本身并进入类型描述符的世界等等,但如果你想要做的就是隐藏一些属性,这就太过分了。

希望这有帮助。

对于C ++,这是一个在 propertyGrid 中显示所选类别的简单解决方案。

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

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

此问题类似,但答案是更完整。有些人可能希望交叉参考。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top