- - PR -
【DataGridView】Shift + Enter で Shift + Tab の動きをさせる方法
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 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 | ||||
|
投稿日時: 2007-09-13 16:37
とあるので、 Shift+Enterが押された際に、MyBase.ProcessDialogKey(Keys.Shift Or Keys.Tab) てな具合でどうですか? | ||||
|
投稿日時: 2007-09-14 09:11
Ahfさん、ありがとうございます。
出来ました! MyBase.ProcessDialogKey(Keys.Shift Or Keys.Tab) でOKでした。 ProcessDataGridViewKeyも上記の書き方で大丈夫でした。 本当にありがとうございました。助かりました。 今後もよろしくお願い致します。 |
1