拡張したコントロールのイベントを上書きする方法ありますか?

回答済み 拡張したコントロールのイベントを上書きする方法ありますか?

  • 2012年8月2日 3:53
     
     

    いつもこちらの方ではお世話になっています。

    調査しても良い方法が見つからないため
    ご教授お願いします。

    フレームワーク:4.0
    クラサバで開発を行っています。

    DataGridViewを拡張し、その中でOnCellLeaveをoverrideしています
    //拡張した内容
    protected override void OnCellLeave(DataGridViewCellEventArgs e)
    {
        base.OnCellLeave(e);
        //背景色を元に戻す
        this[e.ColumnIndex, e.RowIndex].Style.BackColor = Color.FromKnownColor(KnownColor.Window);
    }
       
    このように拡張先でイベントを記述すれば、
    個々で背景色を元に戻す処理を記述しなくても、背景色が元に戻るのですが、
    背景色を元に戻したくないパターンもごくまれにあります。
    その場合、個々の画面でどのような処理を記述すればよいのでしょうか?

    OnCellLeaveの処理を行わずに、個々のグリッドのCellLeaveだけを発生される方法
    はないのでしょうか?

    宜しくお願いします。

すべての返信

  • 2012年8月2日 4:05
    モデレータ
     
     

    背景色を元に戻すかどうかの制御するフラグをプロパティで用意すれば良いのではないでしょうか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

  • 2012年8月2日 4:21
     
     

    返信ありがとうございます。

    質問ではグリッドの背景色を問題であげましたが、実は他のコントロールにも
    同様の問題があるのです。
    テキストボックスも拡張していて、OnKeyDownやOnPreviewKeyDownを
    overrideしてます。
    //OnKeyDownの拡張した内容
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            base.OnKeyDown(e);
        }
    }

    この時では、Enterキーでしかイベントの処理が実行されないので
    イレギュラーケースの場合、拡張したOnKeyDownイベントは
    発生させず、個々のKeyDownイベントだけを発生させたいのです

    そのため、プロパティで制御する方法では、具合が悪いのです

    お願いします。

  • 2012年8月2日 4:39
    モデレータ
     
     回答済み

    ごめんなさい。書かれていることがよく理解できていないのですが、必要に応じてEnterキーの押下時のみにKeyDownイベントを発生させたいということではないのでしょうか?であれば、以下のようにプロパティで制御する方法が具合が悪いというのはどのような理由によるのでしょうか?

    public bool FireKeyDownOnlyEnterKey{get; set;}

    /OnKeyDownの拡張した内容
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (FireKeyDownOnlyEnterKey)
        {
           if (e.KeyCode == Keys.Enter )
                           base.OnKeyDown(e);
        }
        else
        {
            base.OnKeyDown(e);
         }
    }

    また、OnKeyDownイベントではなく、OnKeyDownはイベントを発動するためのメソッドです。


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/

    • 回答としてマーク Ninichi 2012年8月2日 5:11
    •  
  • 2012年8月2日 4:48
    モデレータ
     
     

    もしくは、EnterKeyの場合のみに発生するイベントを定義しても良いと思います。

    //OnKeyDownの拡張した内容
    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.KeyCode == Keys.Enter)
        {
            OnEnterKeyDown(e);       //EnterKeyの押下時のみに発生する独自に定義したイベントを発動
        }

       base.OnKeyDown(e);
    }

    しかし、基本に戻って、イベントリスナー側でKeyDownイベントハンドラの引数によって押されたキーの種類を識別し、それによって処理を振り分けるのが普通なのですが、これがダメな理由は何でしょうか?


    ★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://d.hatena.ne.jp/trapemiya/


  • 2012年8月2日 5:10
     
     

    返信ありがとうございます。

    ダメというわけではないのですが、
    以前の開発では
    個々のテキストボックスのKeyDownで
    if (e.KeyCode == Keys.Enter)
    {
     //個々のテキストボックスの処理
    }
    の記述をしているのですが、
    拡張先に上記の処理を記載すれば、ステップ数が
    減ると思い、今回の開発では拡張先に記述したのです。

    そして開発を進めていくと、Enter以外のキーでも
    処理が必要になる場合があるため、OnKeyDownを
    上書き出来ればいいな、と思い質問されて頂きました。

    最初の回答のプロパティの処理を見て、
    プロパティが全てのケースに対応できると思うので
    プロパティで対応しようと思います。

    ご迷惑おかけして、すいませんでした。
    ありがとうございます。