MJHD

エモさ駆動開発

DataGridViewにおいて、Enterで選択を下に移動させない

C#で、DataGridViewのセルの編集中に、編集内容を確定しようとenterを押すと、確定と同時に下に選択が移ってしまうのをどうにかしようと苦戦した。

ネットで探すと、ProcessDialogKey関数をオーバーライドして、キーコードがEnterだったらthis.EndEdit()を実行すればいい、と書いてあるが、実はこれだけでは、OnCellEndEditイベントが発生しない。

MSDNを読んでも、

public bool EndEdit()

このメソッドは CellEndEdit のイベントを発生させます。

DataGridView.EndEditメソッド(System.Windows.Forms)

とか書いてあるのに…。


3,4時間悩んだあげく、不思議なコードを追加することで解決できたため、メモしておく。

まず、DataGridViewを継承したクラスを作り、ProcessDialogKey関数をオーバーライドする。 他のサイトに書いてある方法だと、Enterキーだった場合は、this.EndEdit()を実行するだけだったが、ここを以下のように書く。

       protected override bool ProcessDialogKey(Keys keyData)
        {
            if ((keyData & Keys.KeyCode) == Keys.Enter)
            {
                var currentCell = this.CurrentCell; // ここ重要
                this.EndEdit();
                this.CurrentCell = null; // ここも
                this.CurrentCell = currentCell; // ここも
                return true;
            }
            return base.ProcessDialogKey(keyData);
        }

一度、this.CurrentCellを別の値に変更する必要があるらしい。

しかし、全くの謎仕様。