none
継承したTextBoxのデフォルトText値を指定したい RRS feed

  • 質問

  • TextBoxを継承し、Text値のデフォルトを設定したいと思いましたが、うまく実装できずに悩んでいます。

    以下のようにTextアクセサをoverrideした上でDefaultValueを設定してみましたが、動作してくれません。
    これも恐らく、TextBoxBaseDesignerにおいてTextプロパティを変更している関係で、DefaultValueから変更された、という状態になっているだけと思われます。

        public partial class Component1 : TextBox
        {
            [DefaultValue("0")]
            public override string Text
            {
                get
                {
                    return base.Text;
                }
                set
                {
                    base.Text = value;
                }
            }
        }

    ControlDesignerを継承したクラスを利用し、InitializeNewComponent()でText値を変更すれば出来ましたが、TextBoxBaseDesignerでの処理が行われなくなる為、その方法以外で何とかしたいのですが、どうにかならないものでしょうか?

    特定の条件に応じた値しか許可しないTextBoxを実装しようとしている為、デザイナに貼り付けた直後にText値が
    空だと困るからどうにかしたい、というのが現在の困りごとになります。

    • 編集済み takiru 2013年3月27日 8:13
    2013年3月27日 8:12

回答

  • 普通にコンストラクタで初期値を設定してしまうのではダメ?

    public partial class Component1 : TextBox
    {
        public Component1()
        {
            this.Text = "ABC";
        }
        public override string Text
        {
            get
            {
                return base.Text;
            }
            set
            {
                if (IsComponentPaste)
                {
                    return;
                }
                base.Text = value;
            }
        }
        private bool IsComponentPaste
        {
            get
            {
                string trace = Environment.StackTrace;
                return DesignMode
                    && (trace.Contains("System.Windows.Forms.Design.ControlDesigner.InitializeNewComponent")
                        || trace.Contains("System.Windows.Forms.Design.TextBoxBaseDesigner.InitializeNewComponent"));
            }
        }
    }


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

    • 回答の候補に設定 佐伯玲 2013年3月28日 0:12
    • 回答としてマーク takiru 2013年3月28日 0:25
    2013年3月27日 9:02

すべての返信

  • 普通にコンストラクタで初期値を設定してしまうのではダメ?

    public partial class Component1 : TextBox
    {
        public Component1()
        {
            this.Text = "ABC";
        }
        public override string Text
        {
            get
            {
                return base.Text;
            }
            set
            {
                if (IsComponentPaste)
                {
                    return;
                }
                base.Text = value;
            }
        }
        private bool IsComponentPaste
        {
            get
            {
                string trace = Environment.StackTrace;
                return DesignMode
                    && (trace.Contains("System.Windows.Forms.Design.ControlDesigner.InitializeNewComponent")
                        || trace.Contains("System.Windows.Forms.Design.TextBoxBaseDesigner.InitializeNewComponent"));
            }
        }
    }


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

    • 回答の候補に設定 佐伯玲 2013年3月28日 0:12
    • 回答としてマーク takiru 2013年3月28日 0:25
    2013年3月27日 9:02
  • ご回答ありがとうございます。

    確かに・・・デザイン設置時ということと、デフォルト値であるということに捕われすぎてましたね。
    ちょっと試してみます。

    2013年3月28日 0:20
  • あっさりできちゃいました!ありがとうございます。
    2013年3月28日 0:25