首页 > 解决方案 > keydown 时如何检测我的datagridview?

问题描述

当datagridview单元格更改或按回车键时,我有一个代码用于在datagridview中选择正确的单元格

但是当我按下回车键时代码总是在运行

只有我在 datagridview 中才能做到这一点?

Private KeyHandled As Boolean
  Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
      If FAT_TABLO.RowCount = 0 Then Exit Function

      Dim icolumn As Integer = FAT_TABLO.CurrentCell.ColumnIndex
      Dim irow As Integer = FAT_TABLO.CurrentCell.RowIndex

      If keyData = Keys.Enter Then
          If icolumn = FAT_TABLO.Columns.Count - 1 Then
              FAT_TABLO.Rows.Add()
              FAT_TABLO.CurrentCell = FAT_TABLO(0, irow + 1)
          Else
              FAT_TABLO.CurrentCell = FAT_TABLO(icolumn + 1, irow)
          End If
          Return True
      Else
          Return MyBase.ProcessCmdKey(msg, keyData)
      End If
  End Function

标签: vb.net

解决方案


尝试这个

    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            'add new dgv
            Dim Dgv1 As New DGV
            With Dgv1
    
                .AllowUserToAddRows = False
    
                .Columns.Add("ColA", "A")
                .Columns.Add("ColB", "B")
                .Columns.Add("ColC", "C")
                .Rows.Add(5)
                .Dock = DockStyle.Top
            End With
            Me.Controls.Add(Dgv1)
        End Sub
    End Class
    
Class DGV
    Inherits DataGridView

    Protected Overrides Function ProcessDataGridViewKey(e As KeyEventArgs) As Boolean
        If e.KeyData = Keys.Enter And Me.Rows.Count > 0 Then
            With Me.CurrentCell
                If .ColumnIndex < Me.Columns.Count - 1 Then
                    'Move to next cell
                    Me.CurrentCell = Me.Item(NextVisCol(.ColumnIndex + 1), .RowIndex)
                    Return True
                ElseIf .ColumnIndex = Me.Columns.Count - 1 Then
                    If .RowIndex = Me.Rows.Count - 1 Then
                        'Add new row 
                        Me.Rows.Add()
                    End If
                    'Move to first cell in next row
                    If Me.Rows(.RowIndex).IsNewRow = False Then Me.CurrentCell = Me.Item(NextVisCol(0), .RowIndex + 1)
                    Return True
                End If
            End With
        End If
        Return MyBase.ProcessDataGridViewKey(e)
    End Function

    Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
        If keyData = Keys.Enter Then Return ProcessDataGridViewKey(New KeyEventArgs(Keys.Enter))
        Return MyBase.ProcessCmdKey(msg, keyData)
    End Function

    Private Function NextVisCol(Optional start As Integer = 0) As Integer
        For i As Integer = start To Me.Columns.Count - 1
            If Me.Columns(i).Visible Then Return i
        Next
        For i As Integer = 0 To Me.Columns.Count - 1
            If Me.Columns(i).Visible Then Return i
        Next
        Throw New Exception("All columns are not visible")
    End Function
End Class

推荐阅读