.NET TIPS

コントロールに対するキー入力をフォームで処理するには?

デジタルアドバンテージ
2004/11/12

 Windowsフォーム上に配置したコントロールに対してキーが入力されたときに何らかの処理(以降、キー処理)を実行したい場合、通常はそれぞれのコントロールごとにキー・イベント(KeyPressイベント、KeyDownイベント、KeyUpイベント)のハンドラ・メソッドを用意して、その処理を実装することになる。

【キー・イベントについて】
KeyPressイベントは文字キー(例えば[A]キー)を押した場合に発生し、KeyDownイベントはどのキー(例えば[Delete]キー)を押し下げても発生する。KeyUpイベントは(押し下げていた)キーを離したときに発生する。この3つのイベントの発生順序は、KeyDownイベント→KeyPressイベント→KeyUpイベントの順となる。

 しかし、もしそのキー処理がフォーム内のコントロールに共通のものなら(例えば、すべてのコントロールに対して[Enter]キーを押すとフォーカス移動するように処理したい場合など)、フォームのKeyPreviewプロパティをTrueに設定すると(デフォルトはFalseとなっている)、すべてのコントロールのキー処理を1つのメソッド(フォームのキー・イベント・ハンドラ)にまとめることができる。

 また、通常ならコントロールを増やすたびにそのコントロールに対してイベント・ハンドラを追加しなければならないが、フォームのKeyPreviewプロパティを使えば、その作業が不要となる。

 次のサンプル・コードでは、実際にフォームのKeyPreviewプロパティをTrueに設定して、フォームのイベント・ハンドラのみでキー処理を行っている。これによりすべてのコントロールのキー入力をフォームのキー・イベント・ハンドラでまとめて処理している。このフォームに対してコントロールを追加・削除した場合も、そのたびにキー処理を追加・削除する必要はない。

using System;
using System.Drawing;
using System.Windows.Forms;

namespace keypreview
{
  public class Form1 : Form
  {
    private CheckBox checkBox1;
    private ComboBox comboBox1;
    private ListBox listBox1;
    private TextBox textBox1;

    [STAThread]
    static void Main()
    {
      Application.Run(new Form1());
    }

    public Form1()
    {
      checkBox1 = new CheckBox();
      comboBox1 = new ComboBox();
      listBox1 = new ListBox();
      textBox1 = new TextBox();
      checkBox1.Location = new Point(32, 16);
      comboBox1.Location = new Point(32, 40);
      comboBox1.Size = new Size(240, 20);
      listBox1.Location = new Point(32, 120);
      textBox1.Location = new Point(32, 80);
      AutoScaleBaseSize = new Size(5, 12);
      ClientSize = new Size(292, 318);
      Controls.Add(textBox1);
      Controls.Add(listBox1);
      Controls.Add(comboBox1);
      Controls.Add(checkBox1);
      KeyPreview = true;
      KeyDown += new KeyEventHandler(Form1_KeyDown);
    }

    // すべてのコントロールのキー入力を一括処理

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
      listBox1.Items.Add(e.KeyCode.ToString());
    }
  }
}
コントロールのキー入力を一括処理するサンプル・コード(C#)
 
Namespace keypreview
  Public Class Form1
      Inherits Form
    Private checkBox1 As CheckBox
    Private comboBox1 As ComboBox
    Private listBox1 As ListBox
    Private textBox1 As TextBox

    Shared  Sub Main()
      Application.Run(New Form1())
    End Sub

    Public  Sub New()
      checkBox1 = New CheckBox()
      comboBox1 = New ComboBox()
      listBox1 = New ListBox()
      textBox1 = New TextBox()
      checkBox1.Location = New Point(32, 16)
      comboBox1.Location = New Point(32, 40)
      comboBox1.Size = New Size(240, 20)
      listBox1.Location = New Point(32, 120)
      textBox1.Location = New Point(32, 80)
      AutoScaleBaseSize = New Size(5, 12)
      ClientSize = New Size(292, 318)
      Controls.Add(textBox1)
      Controls.Add(listBox1)
      Controls.Add(comboBox1)
      Controls.Add(checkBox1)
      KeyPreview = True
    End Sub

    ' すべてのコントロールのキー入力を一括処理
    Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles MyBase.KeyDown
      listBox1.Items.Add(e.KeyCode.ToString())
    End Sub
  End Class
End Namespace
コントロールのキー入力を一括処理するサンプル・コード(VB.NET)

 これを実行したのが次の画面である。

コントロールのキー入力を一括処理するプログラムの実行例

 このサンプル・プログラムでは、上からCheckBoxコントロール、ComboBoxコントロール、TextBoxコントロール、ListBoxコントロールがフォーム上に配置されている。このいずれのコントロールに対してキーを入力しても、フォームのKeyDownイベント・ハンドラ(=Form1_KeyDownメソッド)でそれを一括処理する。例えば、このフォームに新たにコントロールを追加した場合でも、何も実装することなくフォーム共通のキー処理が追加したコントロールに対しても実行されることになる。End of Article

カテゴリ:Windowsフォーム 処理対象:キーボード
使用ライブラリ:Formクラス(System.Windows.Forms名前空間)
 
この記事と関連性の高い別の.NET TIPS
Windowsアプリケーションで[Enter]キーによるフォーカス移動を行うには?
Windowsアプリケーションでキー処理が行われる順序は?
Windowsアプリケーションで方向キーなどの特殊キーを処理するには?
基本フォームから継承された内容を派生フォームでカスタマイズするには?
各フォームの共通要素を基本フォームにまとめるには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間