プロが教えるわが家の防犯対策術!

環境:Visual Studio 2005 C# Windows Application
フォームに自作のユーザコントロールを貼り付けてそのイベントを取得する勉強をしているものです。

フォームでのユーザコントロールイベントを取得して処理をする方法が分かりません。

状況
ユーザコントロールにはテキストボックスを追加しています。
また、フォームにそのユーザコントロールを追加しています。

確認したいことは、ユーザコントロールのテキストボックスになにか値を入力したタイミングでチェンジイベントをフォーム側で察知し、処理をするというものです。

どなたか、要点だけでもいいので教えていただけないでしょうか?

宜しくお願いいたします。

A 回答 (1件)

外部用のdelegateとコントロールで発生するイベント、内部コントロールで発生するイベントの関連付けを行いましょう



コントロール側のソースのclass定義の外で

  public delegate void ChangeEventHandler(object sender, EventArgs e);
といったデリゲートを設置します

コントロールのクラス定義の中で
// 外部で使うイベント名を定義 ... Changedを使用
public event ChangeEventHander Changed;
// 内部で発生したイベントを外部に知らせる
protected void OnChange( EventArgs e )
{
  // 外部のイベントハンドラが接続されているなら
  if ( Changed != null ) {
    Changed( this, e )
  }
}

private textBox1_TextChanged(object sender, EventArgs e)
{
  // 内部のイベントハンドラを呼び出す
  OnChaned(e);
}

といった記述になります

利用する側では
デザイナでコントロールを選択してプロパティウィンドウをイベントタブに切り替えて『Changed』ハンドラを追加するか

コードで
private void OnChanged(object s, EventArgs e)
{
  MessgeBox.Show("sampel");
}

private void Form_Load(object sender, EventArgs e)
{
  // コントロールのChangedイベントハンドラの設定
  UserControl1.Changed += new ChangeEventHandler( OnChanged )
}
といった具合にします

この回答への補足

早速のご回答ありがとうございました。
コーディングして動作を確認することができました。

コーディングしていて確認させていただきたいことが出てきたので
教えていただけないでしょうか?
1.ユーザコントロール.テキストボックスの入力値を取得したい場合
(1)public delegate void ChangeEventHandler(object sender, EventArgs e, string inputValue);
(2)TextAChanged(this, e,this.textBox1.Text);
Changed( this, e ,this.textBox1.Text)
(3)private void OnChanged(object s, EventArgs e, string inputValue)
とすればようろしいでしょうか?それとも他に良い実装方法があるのでようか?

2.異なる event であっても引数が同じであれば delegate の定義は一つでよろしいでしょうか?

度々の質問申し訳ありません。宜しくお願いします。

補足日時:2009/04/17 10:59
    • good
    • 8

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています