让控件真正获得输入焦点(winform)
众所周知 Control.Focus() 可以让控件获得焦点;即使这个控件处于继承自 ScrollableControl 的有滚动条的容器内,并且不在显示的范围内,Focus 方法也会将滚动条滚动至该控件的顶端以让它显示在用户面前。
但是有一种情况是例外的,当这个控件是在 TabControl 的 TabPage 里,而 TabControl 当前的 TabPage 不是控件所在的那一个,调用控件的 Focus 方法时,并不会自动激活控件所在的 TabPage ,不知道算不算M$的 Bug 了。不管如何,还是要解决这个问题的,所以我写了个方法作辅助,考虑到可能会嵌套了n层 TabControl 的情况,用到了 递归+判断父控件 。
PS: 主要使用场景是验证表单数据是否正确时,如果不正确就要定位到输入异常的控件,要不然,弹出提示后,用户还要去找控件的所在,这是非常不好的体验。
上码:
PublicSub SelectControl(ByVal control As Control)
Me.SelectControl(Me, control)
End Sub
PublicSub SelectControl(ByVal container As Control, ByVal control As Control)
If (control.Parent IsNothing OrElse control.Parent Is container) Then
control.Focus()
Return
EndIf
Me.SelectControl(container, control.Parent)
If (TypeOf control.Parent Is TabPage) Then
DirectCast(control.Parent.Parent, TabControl).SelectedTab = control.Parent
EndIf
If (TypeOf control Is TabPage) Then
DirectCast(control.Parent, TabControl).SelectedTab = control
Return
EndIf
control.Focus()
End Sub
Me.SelectControl(Me, control)
End Sub
PublicSub SelectControl(ByVal container As Control, ByVal control As Control)
If (control.Parent IsNothing OrElse control.Parent Is container) Then
control.Focus()
Return
EndIf
Me.SelectControl(container, control.Parent)
If (TypeOf control.Parent Is TabPage) Then
DirectCast(control.Parent.Parent, TabControl).SelectedTab = control.Parent
EndIf
If (TypeOf control Is TabPage) Then
DirectCast(control.Parent, TabControl).SelectedTab = control
Return
EndIf
control.Focus()
End Sub