众所周知 Control.Focus() 可以让控件获得焦点;即使这个控件处于继承自 ScrollableControl 的容器内,并且不在显示的范围内,Focus 方法也会将滚动条滚动至该控件的顶端。


但是有一种情况是例外的,当这个控件是在 TabControl 的 TabPage 里,而 TabControl 当前的 TabPage 不是控件所在的那一个,调用控件的 Focus 方法时,并不会自动选中所在的 TabPage ,还需要考虑到嵌套 TabControl 的情况,所以我写了个方法作辅助。原理很简单,递归+判断父控件。


上码:

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

作者: 祭天 发表于 2011-05-06 16:32 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架