在PropertyGrid中隐藏一些属性

时间:2018-07-31 11:02:22

标签: c# .net winforms propertygrid

我正在做一个允许用户自定义Control属性的项目。我有一个带有LabelTextBoxButtonPropertyGrid控件的表格。当用户单击Label时,我在Label中显示ProeprtyGrid的属性,使用下面的代码可以正常工作:

propertyGrid1.SelectedObject = SelectedControl;

但是我只想显示一些属性,例如BackColorFontForeColorText。是否可以隐藏属性,因为我不想用户更改或显示给他们?如果是,怎么办?

2 个答案:

答案 0 :(得分:6)

更新

请注意,这仅对隐藏属性有用(如果可以)。 Reza Aghaei 答案实际上是正确的答案。

在其他情况下,如果您只是想在拥有访问权限的情况下只想隐藏某个属性,则将其保留在此处。

原始

最简单的方法可能是使用

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
Microsoft.Office.Interop.Excel.Workbook wb = app.Workbooks.Open(@"E:\test.xlsx");
wb.SaveAs(@"E:\output.csv", Microsoft.Office.Interop.Excel.XlFileFormat.xlCSVWindows);
wb.Close(false);
app.Quit();
Console.WriteLine("Done!");

BrowsableAttribute Class

  

指定是否应将属性或事件显示在   属性窗口。

[Browsable(false)]

Marc Gravell 所指出的,还有

PropertyGrid.BrowsableAttributes Property

  

获取或设置与以下对象关联的可浏览属性:   属性网格已附加。

答案 1 :(得分:4)

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

虽然其他答案是共享有关Browsable的{​​{1}}属性和BrowsableAttributes的正确信息,但我想这不是解决该问题的合适方法。

为现有控件类(例如PropertyGridBrowsable等)设置Label属性或任何其他自定义属性是不切实际的。因为以这种方式,op需要覆盖那些类的所有属性,并使用合适的属性来装饰它们。甚至更糟的是,并非所有财产都可以被覆写。

什么是实际的解决方案?

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

示例

例如,在这里,我创建了一个从CustomTypeDescriptor派生的CustomObjectWrapper类,该类在构造函数中接受一个对象。这样,我可以通过覆盖CustomTypeDescriptor来简单地过滤包装对象的属性。

然后,我没有将GetProperties分配给button1,而是将其包装在PropertyGrid中,并将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);
    }
}

您可以简单地将新的属性名称添加到propertyGrid1.SelectedObject = new CustomObjectWrapper(button1); 的{​​{1}}中。这是公共财产。