環境はVisualBasic2005 WindowsXPです。
DataGridViewでEnterキーを押したときにTabと同じ動きにするソースを
書いています。
ReadOnlyのセルを飛ばす処理を入れました。
参考にしたサイトのソースだと一番下のセルまで行くと次のコントロールに
移るのですが、
自分の書いたソースだと一番下のセルで止まってしまいます。
どういった方法で修正すればいいのかヒントや参考HPでいいので
よろしくお願いします。
参考HP どぼん.NET
http://dobon.net/vb/dotnet/datagridview/enterkeymoveright.html
Protected Overrides Function ProcessDialogKey( _
ByVal keyData As Keys) As Boolean
' 'Enterキーが押された時は、Tabキーが押されたようにする
Dim MaxCellCount As Long = (Me.Rows.Count - 1) * Me.Columns.Count
Dim BreakCellCount As Long = 0
Dim ColInt As Integer = Me.CurrentCell.ColumnIndex + 1
Dim RowInt As Integer = Me.CurrentCell.RowIndex
While (BreakCellCount <= MaxCellCount)
For i As Integer = ColInt To Me.Columns.Count - 1
If Me.Rows(RowInt).Cells(i).ReadOnly = False Then
Me.CurrentCell = Me.Rows(RowInt).Cells(i)
'Return MyBase.ProcessDialogKey(keyData)
End If
BreakCellCount += 1
Next
'チェックするセルを一番左の列に戻す
ColInt = 0
If RowInt < Me.Rows.Count - 1 Then
'改行
RowInt += 1
Else
Exit While
End If
End While
If Me.CurrentCell.RowIndex = Me.Rows.Count - 1 _
And Me.CurrentCell.ColumnIndex = Me.Columns.Count - 1 Then
Return Me.ProcessTabKey(keyData)
End If
End Function
Protected Overrides Function ProcessDataGridViewKey( _
ByVal e As KeyEventArgs) As Boolean
If e.KeyCode <> Keys.Enter And e.KeyCode <> Keys.Tab Then
Exit Function
End If
Dim MaxCellCount As Long = (Me.Rows.Count - 1) * Me.Columns.Count
Dim BreakCellCount As Long = 0
Dim ColInt As Integer = Me.CurrentCell.ColumnIndex + 1
Dim RowInt As Integer = Me.CurrentCell.RowIndex
While (BreakCellCount <= MaxCellCount)
For i As Integer = ColInt To Me.Columns.Count - 1
If Me.Rows(RowInt).Cells(i).ReadOnly = False Then
Me.CurrentCell = Me.Rows(RowInt).Cells(i)
e.Handled = True
Return True
'Return MyBase.ProcessDataGridViewKey(e)
End If
BreakCellCount += 1
Next
'チェックするセルを一番左の列に戻す
ColInt = 0
If RowInt < Me.Rows.Count - 1 Then
'改行
RowInt += 1
Else
Exit While
End If
End While
If Me.CurrentCell.RowIndex = Me.Rows.Count - 1 _
And Me.CurrentCell.ColumnIndex = Me.Columns.Count - 1 Then
e.Handled = True
Return Me.ProcessTabKey(Keys.Tab)
End If
End Function
e.Handled = True・・・キーイベントをキャンセルできるらしい。
ってのが怪しい
e.Handled = Trueの行をコメントにしても次のコントロールへ
とべませんでした。
うまく動かすことができるようになりました。
修正版のソースを載せます。
ありがとうございました。
Protected Overrides Function ProcessDataGridViewKey( _
ByVal e As KeyEventArgs) As Boolean
If e.KeyCode <> Keys.Enter And e.KeyCode <> Keys.Tab Then
Exit Function
End If
Dim MaxCellCount As Long = (Me.Rows.Count - 1) * Me.Columns.Count
Dim BreakCellCount As Long = 0
Dim ColInt As Integer = Me.CurrentCell.ColumnIndex + 1
Dim RowInt As Integer = Me.CurrentCell.RowIndex
While (BreakCellCount <= MaxCellCount)
For i As Integer = ColInt To Me.Columns.Count - 1
If Me.Rows(RowInt).Cells(i).ReadOnly = False Then
Me.CurrentCell = Me.Rows(RowInt).Cells(i)
e.Handled = True
Return True
'Return MyBase.ProcessDataGridViewKey(e)
End If
BreakCellCount += 1
Next
'チェックするセルを一番左の列に戻す
ColInt = 0
If RowInt < Me.Rows.Count - 1 Then
'改行
RowInt += 1
Else
Exit While
End If
End While
If Me.CurrentCell.RowIndex = Me.Rows.Count - 1 _
And Me.CurrentCell.ColumnIndex = Me.Columns.Count - 1 Then
'e.Handled = True
'Return Me.ProcessTabKey(e.KeyCode)
'***********ここを修正!!***************
Me.FindForm().SelectNextControl(Me.FindForm().ActiveControl, True, True, True, True)
End If
ツイート | ![]() |