Vb.net 获取子面板的父面板的名称

Vb.net 获取子面板的父面板的名称,vb.net,winforms,controls,panel,Vb.net,Winforms,Controls,Panel,我有一个Panel对象,它是在另一个Panel对象中动态创建的,该Panel对象也是动态创建的。 如何从子面板获取父面板的名称 我只找到了与表单对象相关的信息 一些可能有助于找到孩子父母的方法 控件的直接父级由控件返回。父级属性: Dim parentName = [SomeControl].Parent.Name 表单容器由方法或属性返回: Dim myForm1 = [SomeControl].FindForm() Dim myForm2 = [SomeControl].TopLevelC

我有一个Panel对象,它是在另一个Panel对象中动态创建的,该Panel对象也是动态创建的。
如何从子面板获取父面板的名称


我只找到了与表单对象相关的信息

一些可能有助于找到孩子父母的方法

控件的直接父级由
控件返回。父级
属性:

Dim parentName = [SomeControl].Parent.Name
表单容器由方法或属性返回:

Dim myForm1 = [SomeControl].FindForm()
Dim myForm2 = [SomeControl].TopLevelControl
Dim myFormName1 = myForm1.Name
Dim myFormName2 = myForm2.Name
您也可以使用,这将返回最外层

UserControl可以使用该属性(但它与
FindForm()
相同)

要查找非表单的外部容器,请执行以下操作:

Private Function FindOuterContainer(ctrl As Control) As Control
    If ctrl Is Nothing Then Return Nothing
    While Not (TypeOf ctrl.Parent Is Form)
        ctrl = FindOuterContainer(ctrl.Parent)
    End While
    Return ctrl
End Function

Dim outerContainer = FindOuterContainer([SomeControl])
Dim outerContainerName = outerContainer.Name
要查找特定类型的外部祖先(例如,您在TabControl的TabPage中的Panel中有一个Panel,您想知道它是什么TabPage):

要查找特定类型的最外层父级:
(例如,您在面板中的TabControl的TabPage中的面板中有一个面板,您希望获取最后一个面板)


[SomeControl]
当然是希望找到其父控件的子控件的实例

你为什么要这个名字?如果它们是在运行时创建的,甚至可能没有名称,除非您显式地设置名称。当然,您真正想要的是
面板本身,而不是它的名称。无论如何,您必须首先实际获取
面板
本身,然后才能像获取任何其他属性一样获取
名称
属性。
Private Function FindOuterContainerOfType(Of T)(ctrl As Control) As Control
    If ctrl Is Nothing Then Return Nothing
    While Not ((TypeOf ctrl.Parent Is Form) OrElse (TypeOf ctrl Is T))
        ctrl = FindOuterContainerOfType(Of T)(ctrl.Parent)
    End While
    Return ctrl
End Function

Dim parentTabPage = FindOuterContainerOfType(Of TabPage)([SomeControl])
Console.WriteLine(parentTabPage.Name)
Private Function FindOuterMostContainerOfType(Of T)(ctrl As Control) As Control
    If ctrl Is Nothing Then Return Nothing
    Dim outerParent As Control = Nothing
    While Not (TypeOf ctrl.Parent Is Form)
        If TypeOf ctrl.Parent Is T Then outerParent = ctrl.Parent
        ctrl = ctrl.Parent
    End While
    Return If(TypeOf outerParent Is T, outerParent, Nothing)
End Function


Dim outermostParentPanel = 
    TryCast(FindOuterMostContainerOfType(Of Panel)([SomeControl]), Panel)
Dim outermostParentPanelName = outermostParentPanel?.Name