【问题标题】:ProcessCmdKey how change focus before send textProcessCmdKey 如何在发送文本之前更改焦点
【发布时间】:2015-05-08 12:19:13
【问题描述】:

我有一个只有文本框和数据网格视图的表单。我希望当用户按下箭头(向上/向下)时,它会浏览 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

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

【问题讨论】:

    标签: vb.net focus


    【解决方案1】:

    您需要确保在包含 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。

    可能不完全符合您的要求。但我认为它可以让你走上正轨。

    【讨论】:

    • 它不起作用...我第一次按任意键时会发送重复的文本,我必须按两次才能获得焦点...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 2019-09-15
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多