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