1

投稿された以下のサンプル コードごとに、ドロップダウンでリスクとデフォルトの値を確認できます。

しかし、「DummyProperty」という名前のプロパティの上に [DefaultValue("Risk")] を設定しているので、Property Grid ドロップダウンで選択された Risk 値を期待します。しかし、それは起こっていません。ここで何が欠けていますか?

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        InitializeComponent();
    }

    string sDummy;

    [DefaultValue("Risk")]
    [Category("Test")]
    [ParamDesc("SystemType")]
    [TypeConverter(typeof(PropertyGridTypeConverter))]
    public String DummyProperty
    {
        get { return sDummy; }
        set { sDummy = value; }
    }
}

[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = true)]
public class ParamDesc : Attribute
{
    public ParamDesc(string PD)
    { PropDesc = PD; }

    public string PropDesc 
    { get; set; }

}


class PropertyGridTypeConverter : TypeConverter
{
    List<string> lst = new List<string>();

    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true;
    }

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {
        if (context != null)
        {
            AttributeCollection ua = context.PropertyDescriptor.Attributes;
            ParamDesc cca = (ParamDesc)ua[typeof(ParamDesc)];

            switch (cca.PropDesc)
            {
                case "SystemType":
                    lst = new List<string> {"Risk", "Default"};
                    break;
                case "DateType":
                    lst = new List<string> {"Daily", "Monthly"};
                    break;
            }
        }
        lst.Sort();
        return new StandardValuesCollection(lst);
    }
}
4

1 に答える 1

0

少し紛らわしいことに、DefaultValue カスタム属性は、必要に応じてプロパティに既定値を設定するために使用されません。実際、ランタイムによって直接使用されることはまったくありません。代わりに、Visual Studio デザイナーが使用することを目的としています。

おそらく、他の場所 (UserControl1 コンストラクターなど) で値を初期化したいだけでしょう。

詳細はこちら: プロパティの .Net DefaultValueAttribute

于 2013-07-18T20:15:22.357 に答える