LoginSignup
2
2

More than 5 years have passed since last update.

UserControl.TextChanged イベント

Last updated at Posted at 2018-04-11

ユーザコントロールへ張り付けたTextBoxのTextChagedイベントをフォームで取得する方法

Textプロパティの実装

userControl1.Textの値を変えると、UserControlへ張り付けたTextBoxに表示される値が変わるようにしたいと思います。

UserControlクラスには元々Textプロパティがあるのですが、デザイナからは見えなくなっています。また、UserControl自身のTextなので、UserControlへ張り付けたTextBoxやLabelに表示されるTextとは無関係です。

自作のUserControl1クラスでoverrideして、getterとsetterを編集してtextbox1.Textへ直接get/setするようにします。

        [Browsable(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public override string Text
        {
            set
            {
                textBox1.Text = value;
            }
            get
            {
                return textBox1.Text;
            }
        }

ただオーバーライドしただけでは、デザイナのプロパティウィンドウにTextプロパティが表示されていません。
[Browsable(false)]を、[Browsable(true)]へ変更すると、プロパティウィンドウに表示されるようになります。

さらに、プロパティウィンドウで値を変えれるようになったのですが、実行すると空白のまま起動して、デザイナに戻ると値が消えてしまっています。
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]を、[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]へ変更すると、設定した値を保存したまま起動できるようになります。

TextChagedイベントハンドラの実装

先ほどのプロパティのように[Browsable(true)]にしてoverrideすれば良いかと思いましたが、virtual、abstract または override に設定されていないためオーバーライドできません。と怒られてしまいます。
ですので、newキーワードを使用して、同じ名前のイベントハンドラを新たに宣言しました。
このイベントハンドラではadderとremoverを編集して、フォームからuserControl.TextChangedへ渡されてきたメソッドを、そのままtextbox1.TextChangedへ登録しています。

        [Browsable(true)]
        public new event EventHandler TextChanged
        {
            add
            {
                textBox1.TextChanged += value;
            }
            remove
            {
                textBox1.TextChanged -= value;
            }
        }

これで、デザイナのプロパティウィンドウにTextChangedイベントが表示されていますので、いつものようにダブルクリックするだけで使えるようになります。
Textプロパティの方も、overrideしなくても、newで上書きするのでも別に良い気がします。

ソースコード全体

using System;
using System.ComponentModel;
using System.Windows.Forms;

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

        [Bindable(true)]
        [Browsable(true)]
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
        public override string Text
        {
            set
            {
                textBox1.Text = value;
            }
            get
            {
                return textBox1.Text;
            }
        }

        [Browsable(true)]
        public new event EventHandler TextChanged
        {
            add
            {
                textBox1.TextChanged += value;
            }
            remove
            {
                textBox1.TextChanged -= value;
            }
        }
    }
}
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2