以前にFormを使ったプログラムでEnterキーを押したらまるでTabを押したかのように動作する対策をしましが、落とし穴がありました。

C#を始めよう|フォームでEnterキーをTabキーと同様に動作させる
フォームに複数のコントロール(入力フィールド)が存在するばあい、次のコントロールにフォーカスを移動する時、通常ではTabキーで移動します。しかし、心情的にEnterキーを押したくなりませんか?。Tabキーでの移動は何気に不便と思います。なの...
DataGridViewでは機能しないのです。
Enterキーでは隣のセルにフォーカスが移動しません。
もちろんShift+Enterでも移動しません。
なのでDataGridViewでEnterキーをTabキーと同様に動作するように対策したプログラムを作りました。
C#のコード
using System;
using System.Windows.Forms;
public partial class MyDataGridView : DataGridView
{
protected override bool ProcessDialogKey(Keys keyData)
{
// セルの編集モード時にEnterが押されると次行に移ってしまうので、右隣のセルに移動させる
if ((keyData & Keys.KeyCode) == Keys.Enter)
{
// Tabキーの処理を行う
return this.ProcessTabKey(keyData);
}
// 既定の処理を行う
return base.ProcessDialogKey(keyData);
}
/// DataGridView での移動に使用されるキーを処理します。
protected override bool ProcessDataGridViewKey(KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter && e.Handled == false)
{
// イベントを処理済にする
e.Handled = true;
if (this.CurrentCell != null)
{
// 右下セルのときは次のコントロールにフォーカス移動
if (this.CurrentCell.RowIndex == this.Rows.GetLastRow(DataGridViewElementStates.Visible) &&
this.CurrentCell.ColumnIndex == this.Columns.GetLastColumn(DataGridViewElementStates.Visible, DataGridViewElementStates.None).Index &&
e.Modifiers != Keys.Shift)
{
return this.FindForm().SelectNextControl(this.FindForm().ActiveControl, true, true, true, true);
}
// 左上のセルでShift + Enterが押されたときは前のコントロールにフォーカス移動
if (this.CurrentCell.RowIndex == 0 &&
this.CurrentCell.ColumnIndex == 0 &&
e.Modifiers == Keys.Shift)
{
return this.FindForm().SelectNextControl(this.FindForm().ActiveControl, false, true, true, true);
}
}
// Enterキーが押されらTabキーの処理を行う
return this.ProcessTabKey(e.KeyData);
}
// 既定の処理を行う
return base.ProcessDataGridViewKey(e);
}
}
DataGridViewクラスの派生クラスを作成し、ProcessDialogKeyとProcessDataGridViewKeyメソッドをオーバーライドして、Enterキーが押された時にProcessTabKeyメソッドを呼び出します。
使い方
空クラスを作って上記のコードをコピペ。
ビルドすればフォームデザイナーのツールボックスに「MyDataGridView」が現れます。
ツールボックスのDataGridViewの代わりに新たに出てきたMyDataGridViewを使うだけです。
これでDataGridViewでEnterキーを押したらあたかもTabキーを押したように動作します。
もちろん、Shift+Enterにも対応しています。
コメント