以前に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にも対応しています。
コメント