DataGridViewのProcessDataGridViewKeyイベントで次のコントロールに飛ばすには

解決


うい  2008-05-27 07:21:16  No: 139781

環境は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


やじゅ  2008-05-27 22:34:40  No: 139782

e.Handled = True・・・キーイベントをキャンセルできるらしい。
ってのが怪しい


うい  2008-05-28 07:26:04  No: 139783

e.Handled = Trueの行をコメントにしても次のコントロールへ
とべませんでした。


うい  2008-05-28 07:37:27  No: 139784

うまく動かすことができるようになりました。
修正版のソースを載せます。
ありがとうございました。
    
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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加