17970


こんにちは。  
質問です。よろしくお願いします。

■環境  
VisualStudio2012 C# Windowsフォームアプリケーション

■やりたいこと  
３０個くらいある全てのフォームで、「Enterキーが押されたらTabキーを押したときのように、  
次のコントロールにフォーカスが遷移する」機能を、効率良く実装したい。

■条件  
各フォームにKeyDownイベントが存在する。

■やってみたこと  
・基底クラスを作成し、「FrmBase_KeyDown()」を定義して、  
そこでEnterキーが押されたかを判定して次のコントロールに遷移するよう実装し、  
各フォームはこの基底クラスを継承した。

・だいたいはうまくいった。

・ところが、派生クラス側にKeyDown()イベントが存在する場合、  
基底クラスのKeyDown()が先に呼ばれて次のコントロールに遷移してしまい、  
派生クラスのKeyDown()イベントが呼ばれない。

・先に派生クラスのKeyDown()イベント内の処理が動いてから、  
次のコントロールに遷移したい。

こういうとき、どのように実装するのが効率良いのでしょうか。  
意見、参考サイト等、教えて頂けたら幸いです。

[code]

    public class FrmBase : Form
    {
        private void FrmBase_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                // Enterキーが押されたら、次のコントロールにフォーカス移動
                this.SelectNextControl(this.ActiveControl, true, true, true, true);
                e.Handled = true;
            }
        }
    }
    
    public class FrmChild : FrmBase
    {
        private void TextBox1_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                // Enterキーが押されたら、ある処理をする
            }   
        }
    }
    
[/code]


CC BY-SA 3.0
2015-10-23T02:58:49.167
17966
2015-10-23T06:02:11.920
12916
question
c# winforms
基底クラスのイベントよりも、派生クラスのイベントを先に処理したい


FrmBase_KeyDownメソッド中の、

[code]

    e.Handled=true;
    
[/code]

の部分を、

[code]

    e.Handled=false;
    
[/code]

にしてみてはいかがでしょうか？

先に処理することはできませんが、  
Child側のイベントも呼ばれます。

前後順が重要な場合は、FrmChildそのもののKeyDownを先行させたければ、  
OnKeyDownメソッドのoverrideで実現可能です。

しかし、FrmChildに入れ子になっているコントロールのKeyDownを先行させたい場合は、イベントの前後順を変更できない以上、あまり綺麗ではありませんが、のFrmChild.OnKeyDownのオーバーライドしたメソッド内に、実装する必要があるでしょう。  
ただし、KeyPreviewがTrueである以上、目的のコントロール上でKeyDownが発生したか否かを別途確認する必要があるかと思います。


CC BY-SA 3.0
2015-10-23T05:48:30.327
17970
2015-10-23T06:02:11.920
2015-10-23T06:02:11.920
7287
7287
17966
answer