让控件真正获得输入焦点(winform)

众所周知 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

转载于:https://www.cnblogs.com/jitian/archive/2011/05/06/2039102.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值