方案一:发送Tab键的方案,比较简单,推荐方案,只要使用没问题,就无需使用第二种方法

C# Code:
SendKeys.Send(“{Tab}”);            //发送Tab键

方案二:使用SelectNextControl方法的方案,这个看着简单,使用起来较为麻烦

由于控件编辑和检查等事件的复杂性,导致在处理焦点跳转时,很难进行很好的焦点控制,如在使用SelectNextControl方法时,下一个控件往往不能很好的得到焦点,因此,这里使用了延迟执行的方法,让焦点可以稳定的切换到下一个控件,原理就是让当前的控件事件和检查等执行完后,在延迟部份再执行切换

        Private Sub xEdit_KeyUp(sender As Object, e As KeyEventArgsHandles xEdit.KeyUp

        If (e.KeyCode = Keys.Return) Then
            Dim pControl As Control = CType(sender, Control)
                    Me.SelectNextControl(pControl, TrueTrueTrueTrue)    ‘先执行一遍跳转,但此跳转会被检查之类的逻辑破坏,并不会真正跳转到目标控件,但可以保证触发离开当前控件的事件
            _Timer = New Threading.Timer(AddressOf nextControl, pControl, 100, Threading.Timeout.Infinite) ‘延迟执行跳转到目标控件,可以确保被执行
        End If

    End Sub

        ‘延迟执行跳转代码

    Private Sub nextControl(ByVal pBeginControl As Object)
        If (Me.InvokeRequired) Then
            Dim pCaller As New Action(Of Object)(AddressOf nextControl)
            Me.BeginInvoke(pCaller, New Object() {pBeginControl})
            Return
        End If
        Dim pControl As Control = CType(pBeginControl, Control)
        Me.SelectNextControl(pControl, TrueTrueTrueTrue)

    End Sub

    Private Sub xBefore_Leave(sender As Object, e As EventArgsHandles xEdit.LostFocus
            checkControl()          ‘检查控件操作会导致焦点离开,跳转目标控件无法获得焦点,由延迟执行来保证

    End Sub


    Private Sub FMCalc_Closed(sender As Object, e As EventArgsHandles Me.Closed

        If (_Timer IsNot NothingThen            ‘关闭延迟执行定时器

            _Timer.Dispose()
            _Timer = Nothing
        End If

    End Sub