カーソルキー(方向キー)を用いてフォームのコントロールのフォーカスを移動させる方法を紹介します。
UI
下図のUIを作成します。"KeyPreview"プロパティを"True"に設定します。KeyPreviewプロパティの挙動については
こちらの記事を参照してください。
コード
以下のコードを記述します。フォームのKeyDownイベントを実装します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace FormForcusKeyMove
{
public partial class FormMain : Form
{
public FormMain()
{
InitializeComponent();
}
private void FormMain_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode) {
case Keys.Up:
FocusPrev();
break;
case Keys.Down:
FocusNext();
break;
}
}
private void FocusNext()
{
if (textBox1.Focused == true) {
textBox2.Focus();
}
else if (textBox2.Focused == true) {
textBox3.Focus();
}
else if (textBox3.Focused == true) {
textBox4.Focus();
}
else if (textBox4.Focused == true) {
textBox5.Focus();
}
else if (textBox5.Focused == true) {
button1.Focus();
}
else if (button1.Focused == true) {
textBox1.Focus();
}
}
private void FocusPrev()
{
if (textBox1.Focused == true) {
button1.Focus();
}
else if (textBox2.Focused == true) {
textBox1.Focus();
}
else if (textBox3.Focused == true) {
textBox2.Focus();
}
else if (textBox4.Focused == true) {
textBox3.Focus();
}
else if (textBox5.Focused == true) {
textBox4.Focus();
}
else if (button1.Focused == true) {
textBox5.Focus();
}
}
}
}
解説
KeyPreviewプロパティをTrueに設定しているため、各コントロールのKeyDownイベントが発生するとフォームのKeyDownイベントも発生します。(KeyPreviewプロパティの挙動については
こちらの記事を参照してください。)
フォームのKeyDownイベントではキーコードを判定し[上キー]ならばFocusPrev()メソッドを、[下キー]ならばFocusNext()メソッドを呼び出します。
private void FormMain_KeyDown(object sender, KeyEventArgs e)
{
switch (e.KeyCode) {
case Keys.Up:
FocusPrev();
break;
case Keys.Down:
FocusNext();
break;
}
}
FocusNext,FocusPrevメソッドではどのコントロールにフォーカスがあるかを確認し、FocusNextメソッドではフォーカスのあるコントロールの次のコントロールにフォーカスを与えます。FocusPrevでは前のコントロールにフォーカスを与えます。フォーカスをどのような順番で移動させるかは独自に実装できます。
private void FocusNext()
{
if (textBox1.Focused == true) {
textBox2.Focus();
}
else if (textBox2.Focused == true) {
textBox3.Focus();
}
else if (textBox3.Focused == true) {
textBox4.Focus();
}
else if (textBox4.Focused == true) {
textBox5.Focus();
}
else if (textBox5.Focused == true) {
button1.Focus();
}
else if (button1.Focused == true) {
textBox1.Focus();
}
}
private void FocusPrev()
{
if (textBox1.Focused == true) {
button1.Focus();
}
else if (textBox2.Focused == true) {
textBox1.Focus();
}
else if (textBox3.Focused == true) {
textBox2.Focus();
}
else if (textBox4.Focused == true) {
textBox3.Focus();
}
else if (textBox5.Focused == true) {
textBox4.Focus();
}
else if (button1.Focused == true) {
textBox5.Focus();
}
}
実行結果
プロジェクトを実行します。下図のウィンドウが表示されます。
カーソルキーの上下でフォーカスが移動します。
注意
複数行テキストボックスをフォームに配置した場合、上下キーのフォーカス移動と複数行テキストボックスのカーソル移動のキーが衝突するため、意図した動作にならないので注意してください。複数行テキストボックスではフォームのKeyDownイベントは発生せず、カーソルの上下移動になります。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
最終更新日: 2024-01-06
作成日: 2012-05-19