C#を始めよう|DataGridViewでEnterキーをTabキーと同様に動作させる

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

コメント