根据某些条件,在运行时c#Winforms中的PropertyGrid中使具有特定类别名称的所有属性不可见

时间:2017-03-14 12:13:49

标签: c# winforms propertygrid

我的应用程序中有一个属性Grid,它在运行时显示所选控件的属性。

最近需要为现有控件添加一些额外的属性。为了适应这种情况,引入了一个新类别,在该类别下添加了更新的属性。

现在我正在寻找一种机制来根据应用程序中的运行时条件在运行时隐藏这些新添加的属性。但我没有适当的解决方案。

新增代码:

    [ReadOnly(true)]
    [Browsable(true)]
    [Category("Extra")]
    public int? FormID { get; set; }

    [Browsable(true)]
    [Category("Extra")]
    public int? jrxml_Id { get; set; }

我期待的工作:

    [ReadOnly(true)]
    [Browsable(matchSomeRunTimeCondition)]
    [Category("Extra")]
    public int? FormID { get; set; }

    [Browsable(matchSomeRunTimeCondition)]
    [Category("Extra")]
    public int? jrxml_Id { get; set; }

为什么不起作用?

因为Browsable属性只能接受Constant。 matchSomeRunTimeCondition不是常数。用户可以在应用程序仍在运行时随时更改它。

在代码中,如果有一个函数可以让我在运行时使这些看不见,那么如果有人可以帮我写一个这样的函数或条件语句,我会非常高兴:

  

if(property's category ==“Extra”){

     

//不要在propertygrid中显示此属性。

     

//或换句话说,在运行时使Browasable Attribute为False。

     

}

我的应用程序中的不同控件具有不同的属性,需要在运行时隐藏。

我有一个列表,列出了我要隐藏在应用程序中所选对象中的所有属性,以便在属性网格中显示。

但我需要帮助才能实现这一目标。

注意:我愿意在编译时将browsable属性设置为true / false。但是我想在我的应用程序中运行时设置这个机制,并且需要帮助。

寻找代码解决方案。

我的编码环境(由于公司遗留支持而无法改变):

  • Visual Studio 2010
  • .Net 3.5
  • Windows 10操作系统(是的,我知道)

2 个答案:

答案 0 :(得分:0)

使用TnTinMn发布的答案,我修改了我的代码,使其在运行时隐藏所有选择性属性。

private void ChangeVisibilityBasedOnMode( ref object[] v) {
    if (matchSomeRunTimeCondition) {
        List<string> PropertiesToHide = new List<string> {
            "FormID",
            "jrxml_Id",
        };
        foreach (var vObject in v) {
            var properties = GetProperties(vObject);
            foreach (var p in properties) {
                foreach (string hideProperty in PropertiesToHide ) {
                    if (p.Name.ToLower() == hideProperty.ToLower()) {
                        setBrowsableProperty(hideProperty, false, vObject);
                    }
                }
            }
        }
    }
}
private void setBrowsableProperty(string strPropertyName, bool bIsBrowsable, object vObject) {
    try {
        PropertyDescriptor theDescriptor = TypeDescriptor.GetProperties(vObject.GetType())[strPropertyName];
        BrowsableAttribute theDescriptorBrowsableAttribute = (BrowsableAttribute)theDescriptor.Attributes[typeof(BrowsableAttribute)];
        FieldInfo isBrowsable = theDescriptorBrowsableAttribute.GetType().GetField("Browsable", BindingFlags.IgnoreCase | BindingFlags.NonPublic | BindingFlags.Instance);
        isBrowsable.SetValue(theDescriptorBrowsableAttribute, bIsBrowsable);
    } catch (Exception) { }
}

也感谢neoikon的精彩帖子(Conditional "Browsable" Attribute),我从中获得了最终解决方案。

答案 1 :(得分:0)

这就是为我工作的

    private void SetVisibleSearchOptions(Type searchType, bool visible)
    {
        try
        {
            TypeDescriptor.AddAttributes(searchType, new BrowsableAttribute(visible));
        }
        catch (Exception ex)
        {

        }
    }