- PR -

【DataGridView】Shift + Enter で Shift + Tab の動きをさせる方法

1
投稿者投稿内容
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-09-13 16:13
いつもお世話になっております。
DataGridViewの拡張コントロールを作成しています。

Enterキー押下で次の入力可能項目へ、
Shift + Enter キー押下で前の入力可能項目へ移動する処理を書いています。

最終セルでEnterキー押下時はForm上の次のコントロールへ移動し、
先頭セルでShift + Enter キー押下時はForm上の前のコントロールへ移動したいのですが、

「先頭セルで前のコントロールへ移動する」が出来ません。

上記の処理をProcessDialogKeyに書いてみました。
(最終部分にコードを載せます。)



SendKeys.Send("{Tab}")

とか、

Return Me.SelectNextControl(Me, False, True, True, True)

とやってみたのですが、先頭セルでカーソルは止まったままでした。

この場合どうやって書けば前のコントロールに移動してくれるのでしょうか・・・。


Shift + Tab 押下の場合だと

Return MyBase.ProcessDialogKey(keyData)

と書いておけばOKなので、keyDataの値を Shift + Tab の状態にすれば
OKなのかもしれませんが、デバッグで追おうとすると、
Shiftキー押下の時点でデバッグが走っちゃうので
Shift + Enter 押下時の keyData の中身がどうなってるのかわかりませんでした。



まだコーディングしてないのですが、この後
ProcessDataGridViewKeyにも同様の処理を入れようと思っています。

ProcessDataGridViewKeyでShift + Enter 押下を

If e.Modifiers = Keys.Shift And e.KeyCode = Keys.Enter Then

で判断できる事はわかったのですが、同様に
ここでもどのようにShift + Tab の動きをしてもらうようにすれば良いのかわからないので、
一緒に教えて頂けると嬉しいです。


皆様何卒よろしくお願い致します。

コードは以下のとおりです。


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


Dim uKeyCode As Keys = (keyData And Keys.KeyCode)
Dim uModifiers As Keys = (keyData And Keys.Modifiers)

'Shift + EnterキーもしくはShift + Tabキーが押された時は、前の入力可能項目へ移動
If (uKeyCode = Keys.Tab Or uKeyCode = Keys.Return) AndAlso uModifiers = Keys.Shift Then
Dim iRow As Integer = 0 'RowIndex
Dim iCol As Integer = 0 'ColumnIndex

'次の入力項目を探す
iRow = Me.CurrentCell.RowIndex
iCol = Me.CurrentCell.ColumnIndex
Do While True
If iCol = 0 And iRow = 0 Then
Return Me.SelectNextControl(Me, False, True, True, True)

Return True
End If
'次のセルの位置を算出
If iCol = 0 And iRow > 0 Then
iCol = Me.ColumnCount - 1
iRow = iRow - 1
Else
iCol -= 1
End If

'次のセルの編集可否をチェック
If Me.Item(iCol, iRow).ReadOnly = False Then
'編集可能だったらそのセルに移動して処理を抜ける
Me.CurrentCell = Me.Item(iCol, iRow)
Return True
Else


End If
Loop
End If



'EnterキーもしくはTabキーが押された時は、次の入力可能項目へ移動
If uKeyCode = Keys.Tab Or uKeyCode = Keys.Return Then

Dim iRow As Integer = 0 'RowIndex
Dim iCol As Integer = 0 'ColumnIndex


'次の入力項目を探す
iRow = Me.CurrentCell.RowIndex
iCol = Me.CurrentCell.ColumnIndex
Do While True

If iCol = Me.ColumnCount - 1 And iRow = Me.RowCount - 1 Then
Return (MyBase.ProcessDialogKey(Keys.Tab))
End If

'次のセルの位置を算出
If iCol = Me.ColumnCount - 1 And iRow + 1 <= MyBase.RowCount - 1 Then
iCol = 0
iRow = iRow + 1
Else
iCol += 1
End If
'次のセルの編集可否をチェック
If Me.Item(iCol, iRow).ReadOnly = False Then
'編集可能だったらそのセルに移動して処理を抜ける
Me.CurrentCell = Me.Item(iCol, iRow)
Return True
Else


End If
Loop



End If

End Function
Ahf
大ベテラン
会議室デビュー日: 2006/08/16
投稿数: 172
投稿日時: 2007-09-13 16:37
引用:
reikoさんの書き込み(2007-09-13 16:13)より:
Shift + Tab 押下の場合だと
Return MyBase.ProcessDialogKey(keyData)
と書いておけばOKなので


とあるので、
Shift+Enterが押された際に、MyBase.ProcessDialogKey(Keys.Shift Or Keys.Tab)
てな具合でどうですか?
reiko
ベテラン
会議室デビュー日: 2004/11/19
投稿数: 84
投稿日時: 2007-09-14 09:11
Ahfさん、ありがとうございます。
出来ました!

MyBase.ProcessDialogKey(Keys.Shift Or Keys.Tab)

でOKでした。

ProcessDataGridViewKeyも上記の書き方で大丈夫でした。
本当にありがとうございました。助かりました。

今後もよろしくお願い致します。
1

スキルアップ/キャリアアップ(JOB@IT)