【问题标题】:How do you control what is visible in a property grid at runtime?您如何控制运行时属性网格中可见的内容?
【发布时间】:2012-11-20 07:40:23
【问题描述】:

我有一个显示列表的属性网格,例如类Person

[TypeConverter(typeof(ExpandableObjectConverter))]
public class Person
{
    public bool ShowHidden { get; set; }
    public string Name { get; set; }
    //[Browsable(false)]
    public string Hidden { get; set; }

    public override string ToString()
    {
        return string.Format("Person({0})", Name);
    }
}

问题是如何在运行时控制Browsable() 属性,以便在ShowHidden = false 时省略Hidden 行(下方黄色突出显示)。

谢谢。

【问题讨论】:

    标签: c# winforms propertygrid


    【解决方案1】:

    这是一个例子:

    PropertyDescriptor descriptor=
      TypeDescriptor.GetProperties(this.GetType())["DataType"];
    BrowsableAttribute attrib= 
      (BrowsableAttribute)descriptor.Attributes[typeof(BrowsableAttribute)]; 
    FieldInfo isBrow = 
      attrib.GetType().GetField("browsable",BindingFlags.NonPublic | BindingFlags.Instance);
    isBrow.SetValue(attrib,false);
    

    只需将 DataType 替换为您的属性名称即可。 请注意,所有属性都必须具有正在更改的属性(在本例中为 Browsable)。如果其中一个属性缺少该属性,则所有类属性都会获得新的属性设置。

    代码取自这里:Exploring the Behaviour of Property Grid

    【讨论】:

    • 感谢您的提示。我还没有让它工作。我不知道这个 sn-p 的最佳位置是什么。我在属性设置器中有它,但我看不到对我的网格的影响。
    • 我期望的是只删除具有ShowHidden = false 的实例的行,但它会从所有实例中删除该行。我会接受答案,因为它确实符合我的需要。
    • 代码更改了 BrowsableAttribute,但我没有看到网格中的更改...如何查看运行时更改?
    • @FrancescoDS:您应该能够在运行时看到更改。如果您对此方法有疑问,请发布一个新问题。根据投票的数量,我认为它对其他人有用。
    • @ja2 它隐藏所有属性的原因是因为这仅在所有属性都具有 Browsable 属性时才有效。源链接提到了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2012-06-10
    • 2019-02-08
    • 2010-10-19
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多