【问题标题】:Tab Key Functionality Using Enter Key in VB.Net在 VB.Net 中使用 Enter 键的 Tab 键功能
【发布时间】:2011-12-06 21:00:17
【问题描述】:

我有一个包含近 20 个文本框和 5 个组合框的表单,一个控件依赖于另一个, 现在我想以这样的方式编写表单的代码,按 Enter 键和 Tab 键应该具有相同的功能。

就像按下 Tab 键一样,当我按下 Enter 键时,焦点移动到下一个控件也应该执行。 同样,当我按下 Enter 键时,按键事件中写入了一些过程代码,但当我按下 Tab 键时也应该执行此操作。

【问题讨论】:

  • 这个表单会被用来提交数据吗?我确信可以做到,但是修改典型的高级用户密钥来做到这一点似乎是个坏主意......

标签: .net vb.net visual-studio-2010 textbox


【解决方案1】:

首先让表单的 Keypreview 属性= True 然后将下面的代码粘贴到表单的keydown事件中

 If e.KeyCode = Keys.Enter Then
    Me.SelectNextControl(Me.ActiveControl, True, True, True, False) 'for Select Next Control
End If

【讨论】:

  • 三行编码效果不错。
【解决方案2】:

我在 Winforms 中完成它的方式是使用 SelectNextControl 方法。

Private Sub TextBox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs)
    Dim tb As TextBox
    tb = CType(sender, TextBox)

    If Char.IsControl(e.KeyChar) Then
        If e.KeyChar.Equals(Chr(Keys.Return)) Then
            Me.SelectNextControl(tb, True, True, False, True)
            e.Handled = True
        End If
    End If
End Sub

如果你使用 WPF,你可以使用TraversalRequest

Private Sub TextBox_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Input.KeyEventArgs)
    Dim tb As TextBox
    tb = CType(sender, TextBox)

    If e.Key = Key.Return Then
        tb.MoveFocus(New TraversalRequest(FocusNavigationDirection.Next))
    ElseIf e.Key = Key.Tab Then
        Exit Sub
    End If
End Sub

就拦截 Tab 键而言,看看这个Stackoverflow question

【讨论】:

    【解决方案3】:

    只需制作以下功能

    Public Sub perform_tab_on_enter(ByVal e As KeyEventArgs) 
    If e.KeyCode = Keys.Enter Then 
      SendKeys.Send("{TAB}")
    else
      exit sub
    End If
    e.SuppressKeyPress = True 'this will prevent ding sound 
    End Sub
    

    在控件的 keydown 事件上调用此函数

    【讨论】:

      【解决方案4】:

      我无需为每个控件手动创建或设置事件处理程序即可完成此操作。在表单初始化时,我运行一个函数,循环遍历每个控件并添加一个通用处理函数。

      Private Sub AddHandlers()
          Try
              'Get the first control in the tab order.
              Dim ctl As Windows.Forms.Control = Me.GetNextControl(Me, True)
              Do Until ctl Is Nothing
                  If TypeOf ctl Is System.Windows.Forms.TextBox Or TypeOf ctl Is System.Windows.Forms.ComboBox _
                          Or TypeOf ctl Is System.Windows.Forms.CheckBox Or TypeOf ctl Is System.Windows.Forms.DateTimePicker Then
      
                      AddHandler ctl.KeyDown, AddressOf ReturnKeyTabs
                  End If
                  'Get the next control in the tab order.
                  ctl = Me.GetNextControl(ctl, True)
              Loop
          Catch ex As Exception
          End Try
      End Sub
      
      Private Sub ReturnKeyTabs(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
          If e.KeyCode = System.Windows.Forms.Keys.Return Then
              e.Handled = True
              e.SuppressKeyPress = True
          End If
          ReturnKeyTabs(e.KeyCode)
      End Sub
      
      Private Sub ReturnKeyTabs(ByVal KeyCode As System.Windows.Forms.Keys)
          If KeyCode = System.Windows.Forms.Keys.Return Then
              System.Windows.Forms.SendKeys.Send("{Tab}")
              KeyCode = 0
          End If
      End Sub
      

      【讨论】:

        【解决方案5】:

        我用于相同问题的更好选择是创建一个新的文本框类 textboxClass 并将以下代码粘贴到其按键事件中

            Private Sub commonTextbox_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles Me.KeyPress
                    If Char.IsControl(e.KeyChar) Then
                        If e.KeyChar.Equals(Chr(Keys.Return)) Then
                            Me.Parent.SelectNextControl(Me, True, True, False, True)
                            e.Handled = True
                        End If
                    End If
            End Sub
        

        现在我们可以向任何表单添加任意数量的文本框。它将按需要运行。当在最后一个文本框上按下回车键时,焦点转到第一个。

        此代码取自@Mark Hall,仅用于此页面中的单个文本框。

        【讨论】:

          【解决方案6】:

          这已经很老了,但我来到这里是因为我想做同样的事情。这里的一些答案的问题是,当按下回车键时,它们总是会跳转到下一个控件,而我只希望它使用文本框来执行此操作。如果他们到达一个按钮,我希望他们能够按 Enter 键“单击”该按钮。所以这就是我所做的。

          Private Sub txtName_KeyPress(sender As Object, e As KeyPressEventArgs) Handles txtName.KeyPress, txtAttn.KeyPress, txtAdd1.KeyPress, txtAdd2.KeyPress, txtCity.KeyPress, txtState.KeyPress, txtZip.KeyPress
          
              If Asc(e.KeyChar) = 13 Then
                  e.Handled = True
                  SendKeys.SendWait("{TAB}")
              End If
          
          End Sub
          

          在 sub 的句柄部分添加所有 .keypress 有点痛苦,但是您可以控制哪些项目会导致它移动到下一个控件,哪些不会。当然,您还必须在设计时设置制表位顺序才能使其正常工作。但是使用这种方法,一旦它切换到一个按钮并且他们再次按下回车键,它仍然可以触发一个按钮按下。

          我只是将其添加为评论,但我没有足够的积分来添加 cmets。 :)

          【讨论】:

            【解决方案7】:

            你可以用一些 javascript 来做到这一点: Enter Key Focus

            【讨论】:

              猜你喜欢
              • 2013-03-08
              • 2014-07-02
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多