C#在PropertyGrid中启用/禁用字段

时间:2013-09-24 15:03:22

标签: c# propertygrid

我正在开发一个用户控件库,我需要提供程序员,一个属性网格来自定义控件的属性。
如果程序员使用System.Windows.Forms.PropertyGrid(或Visual Studio的Designer),则应启用/禁用System.Windows.Forms.PropertyGrid中的某些属性字段,具体取决于同一用户控件的某些其他属性。
怎么做?

示例场景

这不是实际的例子,只是一个例子 例如:UserControl1有两个自定义属性:
MyProp_Caption :字符串

MyProp_Caption_Visible :bool
现在,只有当 MyProp_Caption_Visible 为真时,才应在PropertyGrid中启用 MyProp_Caption

UserControl1的示例代码

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);
            }            
        }
    }
}

此UserControl1上的PropertyGrid的示例代码

  • 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?

1 个答案:

答案 0 :(得分:1)

(在问题编辑中由OP回答。转换为社区维基答案。请参阅Question with no answers, but issue solved in the comments (or extended in chat)

OP写道:

  

解决!

     

感谢@Simon Mourier!发布已编辑的代码。   结果:

     

ENABLED DISABLED