我正在做一个允许用户自定义Control
属性的项目。我有一个带有Label
,TextBox
,Button
和PropertyGrid
控件的表格。当用户单击Label
时,我在Label
中显示ProeprtyGrid
的属性,使用下面的代码可以正常工作:
propertyGrid1.SelectedObject = SelectedControl;
但是我只想显示一些属性,例如BackColor
,Font
,ForeColor
,Text
。是否可以隐藏属性,因为我不想用户更改或显示给他们?如果是,怎么办?
答案 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!");
指定是否应将属性或事件显示在 属性窗口。
[Browsable(false)]
如 Marc Gravell 所指出的,还有
PropertyGrid.BrowsableAttributes Property
获取或设置与以下对象关联的可浏览属性: 属性网格已附加。
答案 1 :(得分:4)
我相信您正在寻找自定义类型描述符。
虽然其他答案是共享有关Browsable
的{{1}}属性和BrowsableAttributes
的正确信息,但我想这不是解决该问题的合适方法。
为现有控件类(例如PropertyGrid
,Browsable
等)设置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}}中。这是公共财产。