ユーザコントロールへ張り付けた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;
}
}
}
}