カーソルキー(方向キー)を用いてフォームのコントロールのフォーカスを移動させる - C#

カーソルキー(方向キー)を用いてフォームのコントロールのフォーカスを移動させる方法を紹介します。

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
iPentec all rights reserverd.