none
ユーザーコントロールにイベントを追加したら、呼び出し元のフォームに、必ずそのイベントを追加しないといけないのですか? RRS feed

  • 質問


  • ユーザーコントロールにテキストボックスがあります。
    その中にKeyDownイベントを追加しました。

    public event System.EventHandler usKeyDown1;
    private void txtValue1_KeyDown(object sender, KeyEventArgs e)
    {
      this.usKeyDown1(sender, e);
    }

    次に呼び出し元フォームに
    下記の内容を追加しました。

    this.usItem1.usKeyDown1 += new EventHandler(usItem1_usKeyDown1);
    private void usItem1_usKeyDown1(object sender, EventArgs e)
    {
      //処理
    }

    これで実行すると、ユーザーコントロールのテキストボックスに何か入力した場合、
    上記の「処理」部分に飛び、ちゃんと動くのですが、
    上記を無くしてしまうと、処理が止まってしまいます。

    ユーザーコントロールをいくつも使うため
    そのたびに上記の内容を書くのでは、とても不便なのですが
    何かいい方法は無いのでしょうか?

    2006年11月7日 4:43

すべての返信

  • デフォルトで何もしないのであれば、eventが登録されているかチェックするような記述を入れればどうでしょうか?
    public event System.EventHandler usKeyDown1;
    private void txtValue1_KeyDown(object sender, KeyEventArgs e)
    {
         if (this.usKeyDown1 != null)
             this.usKeyDown1(sender, e);
    }
    2006年11月7日 4:50
  • ユーザーコントロール
    private void txtValue1_KeyDown(object sender, KeyEventArgs e)
    {
      txtValue1KeyDown(sender, e);
      this.usKeyDown1(sender, e);
    }
    protected virtual void txtValue1KeyDown(object sender, KeyEventArgs e)
    {
      //デフォルト処理
    }

    呼び出し元フォーム
    デフォルト以外の追加処理が必要なら
    this.usItem1.usKeyDown1 += new EventHandler(usItem1_usKeyDown1);
    private void usItem1_usKeyDown1(object sender, EventArgs e)
    {
      //追加処理
    }

    デフォルト処理を書き換える必要があればユーザーコントロールを継承したユーザーコントロールを作って
    protected Override void txtValue1KeyDown(object sender, KeyEventArgs e)
    {
      //置き換える処理
    }

    2006年11月7日 5:46
  • ありがとうございます。とても参考になりました。

    イベントを追加したら、そのつど、上記のように書きたいと思います☆

    2006年11月7日 5:50
  • こういう場合って、デフォルトのオーバーライド可能のメソッドをeventとして登録しておくのはダメなんですかね?
    public Hoge() // コンストラクタ
    {
        this.usKeyDown1 += new EventHandler(txtValue1_KeyDown);
    }
    
    private void txtValue1_KeyDown(object sender, KeyEventArgs e)
    {
        //txtValue1KeyDown(sender, e);
        this.usKeyDown1(sender, e);
    }
    
    protected virtual void txtValue1KeyDown(object sender, KeyEventArgs e)
    {
        //デフォルト処理
    }
    2006年11月7日 6:30
  • >こういう場合って、デフォルトのオーバーライド可能のメソッドをeventとして登録しておくのはダメなんですかね?
    いいと思うんですが。
    継承時にうまく動くか自信がなかったので・・・
    あとは大丈夫だといわれていますがイベントの順序とかも気になるので、
    まぎれを減らすように私はメソッドにしています。

    2006年11月7日 7:58
  • 返信ありがとうございます。

     えムナウ さんからの引用

    あとは大丈夫だといわれていますがイベントの順序とかも気になるので、
    まぎれを減らすように私はメソッドにしています。


    そういわれてみれば、順番は気になりますね。
    いろいろ勉強になりました。
    2006年11月7日 8:05