none
C# カスタムコントロール プロパティの初期値を変更する方法 RRS feed

  • 質問

  • VisualStudio 2017 .Net 4.6.1での質問です。

    カスタムコントロールを作成しているのですが、規定値の変更はわかりましたが

    初期値の変更が分かりませんでしたので、ご教授お願いします。

    デザイナにコントロールを貼り付けた時点で、該当の初期値が反映されているのが理想です。

    // 例:radiobutton
    public class CustomRadioButton:RadioButton
    {
            // AutoResetの規定値をFalseとする。
            [DefaultValue(false)]
            public override bool AutoSize
            {
                get { return base.AutoSize; }
                set { base.AutoSize = value; }
            }
       
        public CustomRadioButton()
            {
                   this.AutoSize = false; // 初期値はfalseにしたい。
            }
    }

    上記のように実装したとしても、フォームで貼り付ける際には、初期値Trueで貼り付けられてしまいます。

    よろしくお願いします。

    ※追記

    Buttonの場合の継承はコンストラクタで初期化できました。

    RadioButtonはなぜ・・・

    • 編集済み mogja 2019年4月10日 8:32 追加
    2019年4月10日 8:18

回答

  • ツールボックスから貼り付ける場合にVisualStudioのデザイナがコントロールのToolboxItemAttributeという属性をみて、インスタンスを作っているっぽいのですが、RadioButtonに設定されているAutoSizeToolboxItemというのがAutoSizeをtrueに設定しようとしてるみたいです。

    ですからAutoSizeToolboxItemの継承元であるToolboxItemを使うように属性を上書きしてやれば、AutoSizeを変更されないので目的達成できるでしょう。

    [System.ComponentModel.ToolboxItemAttribute(typeof(System.Drawing.Design.ToolboxItem))]
    public class CustomRadioButton : RadioButton
    {
        // AutoResetの規定値をFalseとする。
        [DefaultValue(false)]
        public override bool AutoSize
        {
            get
            {
                return base.AutoSize;
            }
            set
            {
                base.AutoSize = value;
            }
        }
    
        protected override void OnAutoSizeChanged(EventArgs e)
        {
            base.OnAutoSizeChanged(e);
        }
        public CustomRadioButton()
        {
            this.AutoSize = false; // 初期値はfalseにしたい。
        }
    }



    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2019年4月10日 12:44
    • 回答としてマーク mogja 2019年4月11日 3:13
    2019年4月10日 12:42

すべての返信

  • ツールボックスから貼り付ける場合にVisualStudioのデザイナがコントロールのToolboxItemAttributeという属性をみて、インスタンスを作っているっぽいのですが、RadioButtonに設定されているAutoSizeToolboxItemというのがAutoSizeをtrueに設定しようとしてるみたいです。

    ですからAutoSizeToolboxItemの継承元であるToolboxItemを使うように属性を上書きしてやれば、AutoSizeを変更されないので目的達成できるでしょう。

    [System.ComponentModel.ToolboxItemAttribute(typeof(System.Drawing.Design.ToolboxItem))]
    public class CustomRadioButton : RadioButton
    {
        // AutoResetの規定値をFalseとする。
        [DefaultValue(false)]
        public override bool AutoSize
        {
            get
            {
                return base.AutoSize;
            }
            set
            {
                base.AutoSize = value;
            }
        }
    
        protected override void OnAutoSizeChanged(EventArgs e)
        {
            base.OnAutoSizeChanged(e);
        }
        public CustomRadioButton()
        {
            this.AutoSize = false; // 初期値はfalseにしたい。
        }
    }



    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 編集済み gekkaMVP 2019年4月10日 12:44
    • 回答としてマーク mogja 2019年4月11日 3:13
    2019年4月10日 12:42
  • ありがとうございます、アトリビュートとかいろいろしっておかないといけないんですね・・

    勉強になりました。

    2019年4月11日 3:15