|
.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メソッド)でそれを一括処理する。例えば、このフォームに新たにコントロールを追加した場合でも、何も実装することなくフォーム共通のキー処理が追加したコントロールに対しても実行されることになる。
カテゴリ:Windowsフォーム 処理対象:キーボード
使用ライブラリ:Formクラス(System.Windows.Forms名前空間) |
|
generated by
|
|
Insider.NET 記事ランキング
本日
月間