DataGridViewでエンターキーにより右方向に移動する


2009/07/08 コメント欄にてより簡単な方法についての情報提供がありました

DataGridViewは,デフォルトで編集確定時などでのEnterキー押下に対する動作をカレントセル直下のセルにカレントセルを移動するようになっています.
しかし,例えばExcelでは,そのような状況での動作を直下ではなく右方向のセルに移動するように変更でき,その方が便利な時もあります.
DataGridViewでそのような動作を実現するには,どうしたらいいんでしょうか.
調べてみたところ,プロパティの変更ではなくDataGridViewを継承したコントロールを自分で作成するしかないようです.

こことか,Enterキーで下に移動しないで右に移動,こことか,DataGridViewにおいてEnterキーで右隣のセルへキャレットを飛ばすを参照.

そもそもユーザーコントロールを作ったことがほとんど無いんですが,
プロジェクトの作成で「Windowsコントロールライブラリ」を選択し,
そのプロジェクトにクラスを追加して継承コントロールのコードを書き,
ビルドするとできるDLLを参照の追加で取り込めばツールボックスに現れるようになるようです.

しかし,既にフォームに配置しているDataGridViewを置き換えるのは色々と大変です.
例えば,新たにカラムを追加しないといけないし種々のプロパティも元に戻すために弄らないといけません.
もっと楽な方法を…….

そんなわけで,フォームの初期化をしているコード(FormName.Designer.vb)を直接弄ってDataGridViewを新たに作成したUserDataGridViewに置き換える方法を採用するのが良さそうです.
やり方はいたって簡単.

Private Sub InitializeComponent()
前略
Me.dataGridViewName = New System.Windows.Forms.DataGridView
後略
End Sub

となっているところを,

Private Sub InitializeComponent()
前略
Me.dataGridViewName = New UserControlNameSpace.UserDataGridView
後略
End Sub

とするだけ.
イベント処理などは全て上書きしていて,
外見には通常のDataGridViewと区別が付かないので他を変える必要は無さそうです.
特殊なことをやっているならば違ってくるのかもしれませんが.

  1. フォームのKeyPreviewプロパティをTrueにして(つまりフォームでキーイベントをフックして)、
    フォームのキーイベントで必要な動き(この場合右横のセルに移動)の処理を行いつつ、
    DataGridViewでのEnterキーイベント処理を無効にすれば良い。
    方法については、
    http://www.atmarkit.co.jp/fdotnet/dotnettips/231winentermove/winentermove.html
    を参考にカスタマイズして欲しい。
    この方法は、どのコントロールに対しても有効で、行選択モードの場合にはこのように動け・・・とか・・・
    ~のコントロールについてはこのように動け・・とか々応用が可能。
    旧来(VB6時代)からGrapeCityのSPREADの動きが気に入らない場合にも同様の方法を取っていた。

  2. 情報提供ありがとうございます.
    わざわざユーザコントロールを作成するより簡単にできそうですし,応用範囲も広そうです.

Leave a Comment


NOTE - You can use these HTML tags and attributes:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>