让控件真正获得输入焦点(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
posted @ 2011-05-06 16:32  祭天  阅读(5795)  评论(15编辑  收藏  举报