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

Vb.net ProcessCmdKey如何在发送文本之前更改焦点,vb.net,focus,Vb.net,Focus,我有一个表单,只有一个文本框和一个datagridview。我想当用户按下箭头(向上/向下)时,它会通过datagridview浏览,当用户按下任何其他键时,它会发送到textbox 它不工作,当datagridview具有焦点并且用户按下字母键时,它将焦点更改为textbox,但不发送文本 我的代码: Protected Overrides Function ProcessCmdKey(ByRef msg As System.Windows.Forms.Message, ByVal keyDa

我有一个表单,只有一个文本框和一个datagridview。我想当用户按下箭头(向上/向下)时,它会通过datagridview浏览,当用户按下任何其他键时,它会发送到textbox

它不工作,当datagridview具有焦点并且用户按下字母键时,它将焦点更改为textbox,但不发送文本

我的代码:

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

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

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

然后,在窗体的键控事件中,尝试以下操作:

    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


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

它不起作用…第一次按任何键时,它会发送重复的文本,我必须按两次才能获得焦点。。。。