ProcessCmdKey如何在发送文本之前更改焦点

时间:2015-05-08 12:19:13

标签: vb.net focus

我有一个带有文本框和数据网格视图的表单。我希望当用户按下箭头(向上/向下)时,它会浏览datagridview,当用户按下任何其他键时,它会发送到文本框。

它不起作用,当datagridview具有焦点并且用户按下字母键时,它会将焦点更改为文本框,但不会发送任何文本。

我的代码:

Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyData As System.Windows.Forms.Keys) As Boolean
If keyData = Keys.Down Or keyData = Keys.Up Then
  grid.Focus()
  Return MyBase.ProcessCmdKey(msg, keyData)
ElseIf Not Me.ActiveControl.Equals(txtFiltro) Then
  Me.ActiveControl = txtFiltro
  txtFiltro.Focus()
  txtFiltro.Select()
  Return MyBase.ProcessCmdKey(msg, keyData)
End If
Return MyBase.ProcessCmdKey(msg, keyData)
End Function

密钥在更改焦点之前发送... :(

1 个答案:

答案 0 :(得分:0)

您需要确保在包含DataGridView和TextBox的表单上将属性“KeyPreview”设置为true。

然后在您的表单的KeyDown事件上尝试这样的事情:

    Private Sub Form1_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    If e.KeyCode = Keys.Up Or e.KeyCode = Keys.Down Then

        DataGridView1.Focus()
    Else
        e.Handled = True

        TextBox1.Focus()

        If TextBox1.TextLength = 0 Then
            TextBox1.Text += ChrW(e.KeyValue)
            TextBox1.SelectionStart = 1
        End If
    End If
End Sub

最后一部分将陷阱以查看是否要将按下的任何键传递到文本框。如果你不需要,可以忽略它。然后,如果你回到使用箭头键,它应该重新聚焦到DataGridView。

可能不完全是你想要的。但我认为它可以让你走上正轨。