Zhy*_*yke 4 .net c# propertygrid winforms
我正在做一个允许用户自定义a属性的项目Control.我有了一个控制像一个形式Label,TextBox,Button和PropertyGrid控制.当用户点击Label我显示的属性Label在ProeprtyGrid这是所有使用以下代码精细工作:
propertyGrid1.SelectedObject = SelectedControl;
Run Code Online (Sandbox Code Playgroud)
但我只是想表明像一些性质BackColor,Font,ForeColor,Text.是否可以隐藏属性,因为我不希望用户更改或显示它们?如果有,怎么样?
我相信您正在寻找自定义类型描述符。
虽然另一个答案是共享有关Browsableattribute 和BrowsableAttributesof 的正确信息PropertyGrid,但我想说这不是该问题的正确实用解决方案。
Browsable为现有控件类(如Label、等)设置属性或任何其他自定义属性是不切实际的Button。因为通过这种方式,op 需要覆盖这些类的所有属性并用合适的属性装饰它们。甚至最糟糕的是,并非所有的财产都是可覆盖的。
实际的解决方案是什么?
正如我之前提到的,我相信您正在寻找自定义类型描述符。您可以提供有关分配新对象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);
}
}
Run Code Online (Sandbox Code Playgroud)
并作为用法:
propertyGrid1.SelectedObject = new CustomObjectWrapper(button1);
Run Code Online (Sandbox Code Playgroud)
您可以简单地添加新的属性名BrowsableProperties的CustomObjectWrapper。这是公共财产。
请注意,这仅适用于隐藏属性(如果可以).Reza Aghaei回答其实是正确答案.
如果您只是想在隐藏属性时隐藏属性,请将此处留在此处,因为它适用于其他情况.
原版的
最简单的方法可能是使用
[Browsable(false)]
Run Code Online (Sandbox Code Playgroud)
指定是否应在"属性"窗口中显示属性或事件.
[Browsable(false)]
public int SecretSquirrels
{
get; set;
}
Run Code Online (Sandbox Code Playgroud)
同样正如马克格拉维尔所指出的那样,也有
PropertyGrid.BrowsableAttributes属性
获取或设置与属性网格附加到的对象关联的可浏览属性.
| 归档时间: |
|
| 查看次数: |
877 次 |
| 最近记录: |