让控件真正获得输入焦点(winform)
2011-05-06 16:32
363 查看
众所周知 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
但是有一种情况是例外的,当这个控件是在 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
相关文章推荐
- #308 – 获得当前拥有键盘输入焦点的控件(Checking to See Which Control Has Keyboard Focus)
- WinForm中当TextBox重新获得焦点时输入法失效问题
- Winform禁止容器内控件获得焦点时改变容器显示范围坐标
- 在一个界面中有一个对话条,其中有几个控件,在另外一个对话条中也有几个控件,现在通过按TAB键希望能使这两个对话条中的控件能顺序获得输入焦点
- jquery 插件 thickbox窗口 第一个控件获得焦点(解决第二次弹出窗口,文本不能输入数据)
- jquery 插件 thickbox窗口 第一个控件获得焦点(解决第二次弹出窗口,文本不能输入数据)
- WinForm-Windows控件的焦点事件顺序
- WPF控件 在XP下获得焦点有虚线框
- 控制winform中控件的输入格式
- Delphi中当前获得焦点的控件
- winform学习之-----关于按键操作的一些小知识(如何获取焦点所在的当前控件)20160623
- Android强制让某个控件获得焦点
- C# WINFORM 某些控件实现联想输入功能
- 控件失去焦点与获得焦点
- Android获得当前焦点的控件ID
- winform中如何获得窗体中所有的控件
- JS Enter键跳转 控件获得焦点
- android中设置控件获得焦点
- C# WINFORM 强制让窗体获得焦点(可实现单次置顶或持续置顶)