2011年11月28日月曜日

DataGridviewのEnterによるタブ指定移動

久しぶりの投稿です。
DatagridviewによるEnterでのTAB移動は通常は下の段に移動します。
これを横移動させる方法としては検索すると周知の通りだとおもいます。

さらにこの移動を自在にコントロールしたいと考えたのですがそこまでの需要が無いのか方法がまったくと言っていいほど見当たりませんでした。

そこで簡単に出来ないかと色々試したのですが一番簡単な方法としては次のようになりました。

まずはDatagridviewをオーバーライドします。このオーバーライドしたDatagridviewからでなければ話が先に進みません

Module Datagridview_EX
Public Class CustomDataGridView
Inherits DataGridView

Protected Overrides Function ProcessDialogKey( _
ByVal keyData As Keys) As Boolean

'Enterキーが押された際に、タブキーが押されたことにし、
'それ以外のキーの場合は、通常どおり実行します。
If (keyData And Keys.KeyCode) = Keys.Enter Then
Return Me.ProcessTabKey(keyData)
Else
Return MyBase.ProcessDialogKey(keyData)
End If

End Function

Protected Overrides Function ProcessDataGridViewKey( _
ByVal e As KeyEventArgs) As Boolean

'Enterキーが押された際に、タブキーが押されたことにし、
'それ以外のキーの場合は、通常どおり実行します。
If e.KeyCode = Keys.Enter Then
Return Me.ProcessTabKey(e.KeyCode)
Else
Return MyBase.ProcessDataGridViewKey(e)
End If
End Function
End Class
End Module


これで
CustomDataGridViewがツールボックスに新しいコンポーネントとして登録されます。

そこからですが
Return Me.ProcessTabKey(keyData)
この部分がTAB移動させるプロパティに
And Me.ProcessLeftKey(keyData)を後ろに追加する。これは矢印キーを押したことになります。
こうすることで左から順に処理されます。


それでカーソルの位置情報をから指定のTABオーダー制御すると簡単な移動であれば対処が可能となりました。

より複雑な移動は独自で関数などを作成しなければなりませので、判り次第追記しようとおもいます。

尚、Datagridviewで今いるセルの位置情報は下記で取得出来ます。

Private Sub CustomDataGridView1_CellEnter(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles CustomDataGridView1.CellEnter
Me.ROWCNT.Text = e.RowIndex
Me.ColumnNo.Text = e.ColumnIndex
Me.ROWNO.Text = e.RowIndex
CustomDataGridView1.Focus()
End Sub
フォームにROWCNTのテキストBOXとColumnNoというテキストBOXを配置して下さい。