3

コントロールのプロパティをカスタマイズするためのプロパティ グリッドであるプログラマーを提供する必要があるユーザー コントロール ライブラリを開発しています。
プログラマーSystem.Windows.Forms.PropertyGrid(または Visual Studio のデザイナー)を使用する場合、同じユーザー コントロールの他のプロパティに応じて
、プロパティ フィールドの一部を有効/無効にする必要があります。 どうやってするの?System.Windows.Forms.PropertyGrid

シナリオ例

これは実際の例ではなく、説明のみです。
例: UserControl12 つのカスタム プロパティがあります:
MyProp_Caption : 文字列

MyProp_Caption_Visible : bool
これで、MyProp_Caption_Visibleが true の場合にのみ、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 は、次の 2 つのデータ メンバーを持つ単純なフォームです。

        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 を有効/無効にする方法は?

4

1 に答える 1