【问题标题】:SendKeys not working in Datagridview keydown eventSendKeys 在 Datagridview keydown 事件中不起作用
【发布时间】:2014-07-24 17:41:20
【问题描述】:

我的表单上有一个包含两列的 Datagridview。我只希望选择第一列中的单元格。所以我使用datagridview 的keydown 事件来捕获TAB 和SHIFT+TAB。因此,如果选择了第一行并且用户按下了 Tab,则将选择第二行,而不是停留在第一行并选择第二列的单元格。

我的 TAB 键的 if 语句工作正常,但由于某种原因 SHIFT+TAB 语句不能正常工作。当前选定单元格上方的单元格未被选中。什么都没有发生。

Private Sub myGrid_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles myGrid.KeyDown
    If e.KeyCode = Keys.Tab Then
        e.SuppressKeyPress = True
        SendKeys.Send("{DOWN}")
    End If

    If e.Modifiers = Keys.Shift AndAlso e.KeyCode = Keys.Tab Then
        e.SuppressKeyPress = True
        SendKeys.Send("{UP}")
    End If
End Sub 

但真正奇怪的是,如果我在语句中添加一个消息框,它会起作用。

If e.Modifiers = Keys.Shift AndAlso e.KeyCode = Keys.Tab Then
    MsgBox("test")
    e.SuppressKeyPress = True
    SendKeys.Send("{UP}")
End If

有什么想法吗?

【问题讨论】:

  • 为什么要重新定义用户体验?所有用户都习惯了上下移动的事实,嗯,上下移动,并且标签是……横向的。这就像让汽车垂直而不是水平运行。
  • 这两列是“问题#”和“分数”。当您选择一行时,表单上的其余信息会更改以匹配所选问题的信息。我只是希望用户只需按一次 TAB 而不是两次即可连续向下。
  • 为什么不让用户使用他们的默认选项 - 上/下?
  • 用户可以根据需要使用向上/向下箭头键。我只是希望 TAB 键从第 0 列:单元格 0 到第 0 列:第 1 列而不是第 0 列:第 0 列到第 1 列:单元格 0

标签: vb.net winforms datagridview


【解决方案1】:

Sendkeys 是最后的最后手段...

这样的事情怎么样:

Private Sub dgv_KeyDown(sender As Object, e As KeyEventArgs) Handles dgv.KeyDown
    If e.KeyCode = Keys.Tab Then
        e.SuppressKeyPress = True
        dgv.CurrentCell = dgv(0, dgv.CurrentCell.RowIndex + 1)
    End If
End Sub

【讨论】:

  • 句柄 dgv.KeyDown 是覆盖。 Shift 需要在同一事件中进行第二次检查。
【解决方案2】:

在@rheitzman 的帮助下,我能够看到主要问题。问题来自在两个不同的 if 语句中使用 TAB 和 SHIFT+TAB。这是我更新的代码:

Private Sub myGrid_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles myGrid.KeyDown
    Dim row As String = Me.myGrid.CurrentCellAddress.Y

    If e.Modifiers = Keys.Shift AndAlso e.KeyCode = Keys.Tab Then
        e.SuppressKeyPress = True
        Me.myGrid.CurrentCell = Me.myGrid.Rows(row - 1).Cells(0)
        Me.myGrid.Rows(row - 1).Cells(0).Selected = True

    ElseIf e.KeyCode = Keys.Tab Then
        e.SuppressKeyPress = True
        Me.myGrid.CurrentCell = Me.myGrid.Rows(row + 1).Cells(0)
        Me.myGrid.Rows(row + 1).Cells(0).Selected = True
    End If
End Sub

【讨论】:

  • 这种技术还是有问题的。单元格处于编辑模式时不会触发 KeyDown 事件。即,如果您编辑一个单元格并按 Tab,则选择会转到下一个单元格,并且网格的 KeyDown 不会触发。我想您必须使用 End 或 Leave 事件来控制单元格的下一个选择。由于 Keycode 不可用,您可能必须将已编辑的单元格索引存储在某处,以确定您在列中是向下还是向上。某处可能有 Cell KeyDown - 我没看到。
  • 我将网格设置为只读。网格仅用于显示问题的数量和对它们的分数。用户使用下拉列表设置问题的分数,然后我将分数添加到网格中。它现在工作正常,我是一个快乐的露营者:)
【解决方案3】:

Tab 和 Shift+Tab 已由 Windows 窗体和 DataGridView 处理。他们移动单元格荧光笔/选择器向左(上一个)和向右(下一个)移动。您必须创建一个继承 DataGridView 的类并手动覆盖其功能以实现您想要的功能,然后将该新类用于您的数据网格。

【讨论】:

    【解决方案4】:
    Private Sub DataGridView1_KeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles DataGridView1.KeyDown
    
        Dim r As Integer = Me.DataGridView1.CurrentCellAddress.Y
        Dim f As Integer = Me.DataGridView1.CurrentCellAddress.X
    
        If e.Modifiers = Keys.Shift AndAlso e.KeyCode = Keys.Tab Then
            e.SuppressKeyPress = True
            If 0 = r Then
                Me.DataGridView1.CurrentCell = Me.DataGridView1.Rows(DataGridView1.RowCount - 1).Cells(f - 1)
                Me.DataGridView1.Rows(DataGridView1.RowCount - 1).Cells(f - 1).Selected = True
            Else
                Me.DataGridView1.CurrentCell = Me.DataGridView1.Rows(r - 1).Cells(f)
                Me.DataGridView1.Rows(r - 1).Cells(f).Selected = True
            End If
        ElseIf e.KeyCode = Keys.Tab Then
            e.SuppressKeyPress = True
            If DataGridView1.RowCount = (r + 1) Then
                Me.DataGridView1.CurrentCell = Me.DataGridView1.Rows(0).Cells(f + 1)
                Me.DataGridView1.Rows(0).Cells(f + 1).Selected = True
            Else
                Me.DataGridView1.CurrentCell = Me.DataGridView1.Rows(r + 1).Cells(f)
                Me.DataGridView1.Rows(r + 1).Cells(f).Selected = True
            End If
        End If
    End Sub
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多