我正在开发一个用户控件库,我需要提供程序员,一个属性网格来自定义控件的属性。
如果程序员使用System.Windows.Forms.PropertyGrid
(或Visual Studio的Designer),则应启用/禁用System.Windows.Forms.PropertyGrid
中的某些属性字段,具体取决于同一用户控件的某些其他属性。
怎么做?
这不是实际的例子,只是一个例子
例如:UserControl1
有两个自定义属性:
MyProp_Caption :字符串
和
MyProp_Caption_Visible :bool
现在,只有当 MyProp_Caption_Visible 为真时,才应在PropertyGrid中启用 MyProp_Caption 。
public class UserControl1: UserControl <br/>
{
public UserControl1()
{
// skipping details
// label1 is a System.Windows.Forms.Label
InitializeComponent();
}
[Category("My Prop"),
Browsable(true),
Description("Get/Set Caption."),
DefaultValue(typeof(string), "[Set Caption here]"),
RefreshProperties(RefreshProperties.All),
ReadOnly(false)]
public string MyProp_Caption
{
get
{
return label1.Text;
}
set
{
label1.Text = value;
}
}
[Category("My Prop"),
Browsable(true),
Description("Show/Hide Caption."),
DefaultValue(true)]
public bool MyProp_Caption_Visible
{
get
{
return label1.Visible;
}
set
{
label1.Visible = value;
// added as solution:
// do additional stuff to enable/disable
// MyProp_Caption prop in the PropertyGrid depending on this value
PropertyDescriptor propDescr = TypeDescriptor.GetProperties(this.GetType())["MyProp_Caption"];
ReadOnlyAttribute attr = propDescr.Attributes[typeof(ReadOnlyAttribute)] as ReadOnlyAttribute;
if (attr != null)
{
System.Reflection.FieldInfo aField = attr.GetType().GetField("isReadOnly", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
aField.SetValue(attr, !label1.Visible);
}
}
}
}
tstFrm是一个包含以下两个数据成员的简单表单
private System.Windows.Forms.PropertyGrid propertyGrid1;
private UserControl1 userControl11;
我们可以通过propertyGrid1自定义userControl1,如下所示:
public partial class tstFrm : Form
{
public tstFrm()
{
// tstFrm embeds a PropertyGrid propertyGrid1
InitializeComponent();
propertyGrid1.SelectedObject = userControl11;
}
}
如何根据MyProp_Caption_Visible的值启用/禁用属性网格中的字段MyProp_Caption?
答案 0 :(得分:1)
(在问题编辑中由OP回答。转换为社区维基答案。请参阅Question with no answers, but issue solved in the comments (or extended in chat))
OP写道:解决!
感谢@Simon Mourier!发布已编辑的代码。 结果: