隐藏PropertyGrid中的一些属性

Zhy*_*yke 4 .net c# propertygrid winforms

我正在做一个允许用户自定义a属性的项目Control.我有了一个控制像一个形式Label,TextBox,ButtonPropertyGrid控制.当用户点击Label我显示的属性LabelProeprtyGrid这是所有使用以下代码精细工作:

propertyGrid1.SelectedObject = SelectedControl;
Run Code Online (Sandbox Code Playgroud)

但我只是想表明像一些性质BackColor,Font,ForeColor,Text.是否可以隐藏属性,因为我不希望用户更改或显示它们?如果有,怎么样?

Rez*_*aei 7

我相信您正在寻找自定义类型描述符。

虽然另一个答案是共享有关Browsableattribute 和BrowsableAttributesof 的正确信息PropertyGrid,但我想说这不是该问题的正确实用解决方案。

Browsable为现有控件类(如Label、等)设置属性或任何其他自定义属性是不切实际的Button。因为通过这种方式,op 需要覆盖这些类的所有属性并用合适的属性装饰它们。甚至最糟糕的是,并非所有的财产都是可覆盖的。

实际的解决方案是什么?

正如我之前提到的,我相信您正在寻找自定义类型描述符。您可以提供有关分配新对象TypeDescriptor或实现ICustomTypeDescriptor或派生自的对象的元数据CustomTypeDescriptor

例子

例如,我在这里创建了一个CustomObjectWrapper派生类,该类CustomTypeDescriptor在构造函数中接受一个对象。通过这种方式,我可以简单地通过覆盖GetProperties.

然后,我没有将其分配button1PropertyGrid,而是将其包裹起来CustomObjectWrapper并分配CustomObjectWrapper给属性网格。这样它只显示过滤后的属性,而这些属性实际上来自button1.

这是植入:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
public class CustomObjectWrapper : CustomTypeDescriptor
{
    public object WrappedObject { get; private set; }
    public List<string> BrowsableProperties { get; private set; }
    public CustomObjectWrapper(object o)
        :base(TypeDescriptor.GetProvider(o).GetTypeDescriptor(o))
    {
        WrappedObject = o;
        BrowsableProperties = new List<string>() { "Text", "BackColor" };
    }
    public override PropertyDescriptorCollection GetProperties()
    {
        return this.GetProperties(new Attribute[] { });
    }
    public override PropertyDescriptorCollection GetProperties(Attribute[] attributes)
    {
        var properties = base.GetProperties(attributes).Cast<PropertyDescriptor>()
                             .Where(p=>BrowsableProperties.Contains(p.Name))
                             .Select(p => TypeDescriptor.CreateProperty(
                                 WrappedObject.GetType(),
                                 p,
                                 p.Attributes.Cast<Attribute>().ToArray()))
                             .ToArray();
        return new PropertyDescriptorCollection(properties);
    }
}
Run Code Online (Sandbox Code Playgroud)

并作为用法:

propertyGrid1.SelectedObject = new CustomObjectWrapper(button1);
Run Code Online (Sandbox Code Playgroud)

您可以简单地添加新的属性名BrowsablePropertiesCustomObjectWrapper。这是公共财产。


AAA*_*ddd 6

UPDATE

请注意,这仅适用于隐藏属性(如果可以).Reza Aghaei回答其实是正确答案.

如果您只是想在隐藏属性时隐藏属性,请将此处留在此处,因为它适用于其他情况.

原版的

最简单的方法可能是使用

[Browsable(false)]
Run Code Online (Sandbox Code Playgroud)

BrowsableAttribute类

指定是否应在"属性"窗口中显示属性或事件.

[Browsable(false)]
public int SecretSquirrels
{
  get; set;
}
Run Code Online (Sandbox Code Playgroud)

同样正如马克格拉维尔所指出的那样,也有

PropertyGrid.BrowsableAttributes属性

获取或设置与属性网格附加到的对象关联的可浏览属性.