DataGridView で Enter キーを押下時に「右のセルへ移動」する(サンプルあり)

📋 目次(クリックで展開)

C# の DataGridView では、セルを入力中に Enter キーを押すと、標準(デフォルト)の挙動では「下のセル」へフォーカスが移動します。

しかし、Excel のように「Enter キーを叩きながら、横方向(右のセル)へスムーズに入力進めていきたい」という要望は、業務システムの開発においてよくあります。

この挙動の変更は、画面(Form)の ProcessCmdKey メソッド をオーバーライドし、Enter キーが押された瞬間に「Tab キーの動き」をシステムに送ることで実現できます。

Enter キーで右移動する仕組み

通常、Enter キーが押されると DataGridView は「下へ移動」の処理を実行します。

ProcessCmdKey を用いて、コントロールにキーが届く前に Enter キーの処理を捕捉し、「Enter キーの動きはキャンセルして、代わりに Tab キー(右移動)が押されたことにする」 という処理(SendKeys.Send)を組み込みます。

これにより、自力で「右端のセルかどうか」を計算して行を切り替えるようなロジックを書くことなく、システム標準の横移動(右端に達したら自動で次の行の先頭へ行く動き)を利用できます。

実装コード

画面に DataGridView(dataGridView1)が配置されているものとします。

Form1.cs

Form1.cs
using System.Data;
namespace DataGridView_EnterRightClick;
public partial class Form1 : Form
{
private DataTable _dataTable = new DataTable();
public Form1()
{
InitializeComponent();
InitializeData();
InitializeDataGridView();
}
private void InitializeData()
{
// テストデータの準備(ID、商品名、価格)
_dataTable.Columns.Add("ID", typeof(string));
_dataTable.Columns.Add("Name", typeof(string));
_dataTable.Columns.Add("Price", typeof(int));
_dataTable.Rows.Add("P001", "ノートパソコン", 120000);
_dataTable.Rows.Add("P002", "USBメモリ", 2500);
_dataTable.Rows.Add("P003", "液晶モニター", 35000);
}
private void InitializeDataGridView()
{
dataGridView1.DataSource = _dataTable;
dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
}
/// <summary>
/// フォーム全体のコマンドキー入力を先行して受け取るメソッド
/// </summary>
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
// 1. 押されたキーが「Enter キー」であるかチェック
if ((keyData & Keys.KeyCode) == Keys.Enter)
{
// 2. 現在 DataGridView を入力中(フォーカスがある)かチェック
if (dataGridView1.Focused || dataGridView1.IsCurrentCellInEditMode)
{
// 3. Enter の代わりに、Tab キー(横移動)の入力をシステムに送る
SendKeys.Send("{TAB}");
// 4. true を返すことで、本来の「下へ移動する挙動」をキャンセルする
return true;
}
}
// Enter キー以外、または DataGridView 以外の場所での入力は標準の動きに任せる
return base.ProcessCmdKey(ref msg, keyData);
}
}

ソースコード

サンプルアプリケーション

Enter キー押下で、Tab キー押下と同様に、アクティブセルが右横(次)に移動します。また、Shift + Enter キー押下で、Shift + Tab キー押下と同様に、アクティブセルが左横(前)に移動します。

DataGridView_EnterRightClick.zip
※ サンプルアプリケーションは、.NET 10 をターゲットに作成しています。

実装のポイント

編集モード(文字入力中)でも Enter キーを捕捉

コード内には、次の条件判定を加えています。

if (dataGridView1.Focused || dataGridView1.IsCurrentCellInEditMode)

DataGridView は、「セルを選んでいるだけの状態(Focused)」と、「セルの中にテキストボックスが表示されて文字を入力している状態(IsCurrentCellInEditMode)」の2つの状態があります。 この2つのどちらであっても Enter キーを捕捉できるように条件を重ねておくことで、入力中であっても右(次)へ移動してくれるようになります。

SendKeys.Send("{TAB}") を使うメリット

Enter を検知した後に、自力で CurrentCell のインデックス番号をプラスして右に動かすコードを書く方法もありますが、それだと「右端のセルに達したときに、次の行の左端へ戻す」という処理を自前で計算して書かなければならず、コードが複雑になります。

Windows の標準機能である SendKeys.Send("{TAB}") を使えば、「Tab キーが押されたときと全く同じ動き」をシステムが再現してくれるため、右端に達した時の折り返しも含めて、1行でエクセルのような挙動を実現できます。

3. return true; で処理を終了

Enter を捕捉して Tab キーの命令を送った後は、return true; で処理を終了します。これを行わないと、Tab キーによって「右に移動した」直後に、本来の Enter キーの処理が行われて「さらに下にも移動する」という、斜め下に移動する挙動になってしまうため、標準の動きはここで止めておきます。

まとめ

DataGridView で Enter キーを押したときに右へ移動させる基本は、ProcessCmdKey で Enter を捕捉して SendKeys.Send("{TAB}") を送る のが定石です。

  • ProcessCmdKey を使えば、文字入力中(編集モード)の Enter キーも最上流で補足できる
  • SendKeys.Send("{TAB}") を使うことで、右端から次の行の先頭への折り返し処理を OS に任せられる
  • 横移動をした後は return true; で本来の下移動の動きをキャンセルする

データ登録や伝票入力などの画面を作る際の参考になりましたら幸いです。

関連記事


💬 コメント