.NETのWindowsフォームアプリケーションで、フォームに配置したコントロールのイベントを、フォーム側で取得したい場合があります。
例えば、フォーム上に複数のテキストボックスが配置されており、Enterキーが押された時に、次または前のコントロールにフォーカスを移動したい場合などです。
今回の記事は、C#のプロジェクトを使ってフォームに配置されたコントロールのキーイベントを、フォーム側で受け取って処理する方法を紹介します。
本記事ではVisual Studioで作成した、Windowsフォームアプリケーションのプロジェクトに記述するコードを記載します。
Windowsフォームアプリケーションのプロジェクトを作成する方法については、以下の記事を参照してください。
目次
コントロールのキーイベントを受け取る
コントロールのキーイベントを受け取れるようにするには、System.Windows.Forms名前空間にあるFormクラスのKeyPreviewプロパティを使用します。
KeyPreviewプロパティはbool型(ブーリアン型)になっていますので、TrueまたはFalseの真理値(真偽値)で指定します。
フォームのKeyPreviewプロパティは、フォームデザイナーのプロパティグリッド、またはコードで設定することができます。
デザイナーのプロパティグリッドで設定する
フォームデザイナーを開きます。
フォームデザイナーを開いたら、プロパティウィンドウを表示します。
プロパティウィンドウが表示されていない場合は、メニューバーの「表示」メニューにある「プロパティ ウィンドウ」をクリックするかF4キーを押してください。
上記の画像のプロパティグリッドは項目別ではなくアルファベット順で表示しています。
デザイナーのプロパティグリッドにあるKeyPreviewプロパティのドロップダウンリストから、Enterキーが押された時にクリックされるボタンを選択します。(ドロップダウンリストのアイテムには、フォーム上に配置したボタンの一覧が表示されます。)
コードで設定する
コードエディタを表示して以下のコードを入力します。
1 2 3 |
// フォームでキーが押された時のイベントを受け取る // フォーム(this)のKeyPreviewプロパティにTrueを指定 this.KeyPreview = true; |
キーイベントが発生する順番
フォームのKeyPreviewプロパティをTrueに設定した際のイベントの発生する順番は、フォームのキーイベントが先に発生し、アクティブなコントロールのキーイベントが後に発生します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
using System; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { // コンストラクタ public Form1() { InitializeComponent(); this.KeyPreview = true; this.KeyDown += Form1_KeyDown; this.KeyPress += Form1_KeyPress; this.KeyUp += Form1_KeyUp; this.textBox1.KeyDown += TextBox1_KeyDown; this.textBox1.KeyPress += TextBox1_KeyPress; this.textBox1.KeyUp += TextBox1_KeyUp; } private void TextBox1_KeyUp(object sender, KeyEventArgs e) { Console.WriteLine("TextBox1_KeyUp"); } private void TextBox1_KeyPress(object sender, KeyPressEventArgs e) { Console.WriteLine("TextBox1_KeyPress"); } private void TextBox1_KeyDown(object sender, KeyEventArgs e) { Console.WriteLine("TextBox1_KeyDown"); } private void Form1_KeyUp(object sender, KeyEventArgs e) { Console.WriteLine("Form1_KeyUp"); } private void Form1_KeyPress(object sender, KeyPressEventArgs e) { Console.WriteLine("Form1_KeyPress"); } private void Form1_KeyDown(object sender, KeyEventArgs e) { Console.WriteLine("Form1_KeyDown"); } } } |
コンソールには以下の値が出力されます。
1 2 3 4 5 6 |
Form1_KeyDown TextBox1_KeyDown Form1_KeyPress TextBox1_KeyPress Form1_KeyUp TextBox1_KeyUp |
サンプルプログラム
ここではサンプルプログラムとして、Enterキーが押された時に、フォームに複数配置されたコントロールのフォーカスを順番に移動するアプリケーションを作成します。
フォームデザイン(ユーザーインターフェース)
ソースコード
フォームのKeyDownイベントでEnterキーが押された時の処理を実装します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
using System; using System.Windows.Forms; namespace WindowsFormsApp1 { public partial class Form1 : Form { // コンストラクタ public Form1() { InitializeComponent(); // フォームでコントロールのキーイベントを受け取る this.KeyPreview = true; this.KeyDown += Form1_KeyDown; } // フォームのキーダウンイベントメソッド private void Form1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { // TABキーを送って次のコントロールを選択 SendKeys.Send("{TAB}"); } } } } |
プログラムの実行
サンプルプロジェクトをビルドして実行(デバッグ)します。
Enterキーを押すと、コントロールのフォーカスが移動します。