.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アプリケーションでキー処理が行われる順序は?
Windowsアプリケーションで[Enter]キーによるフォーカス移動を行うには?
Windowsアプリケーションで方向キーなどの特殊キーを処理するには?
各フォームの共通要素を基本フォームにまとめるには?
基本フォームから継承された内容を派生フォームでカスタマイズするには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

TechTargetジャパン

Insider.NET フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH