递归循环以获取对象的父级

时间:2015-01-09 11:59:19

标签: vb.net visual-studio-2010

我正在尝试使用以下函数来获取元素的父对象。

'Recursive until the parent control is found
Public Function __GET_PARENT(ByVal current As Object, ByVal pType As Type)
    Dim nextParent As Object = current.Parent
    If Not nextParent Is Nothing AndAlso Not TypeOf nextParent Is pType Then Return __GET_PARENT(nextParent, pType)
    Return nextParent
End Function

例如,如果我将名为textbox_1的对象作为当前参数传递,并将面板作为上述函数的pType参数传递,则应返回实际的面板对象。

比较TypeOf时遇到错误,nextParent是pType,说没有定义pType。

2 个答案:

答案 0 :(得分:1)

Is运算符将类型作为第二个参数,而不是Type对象。

获取控件的类型并与Type对象进行比较:

... AndAlso nextParent.GetType() <> pType Then ...

旁注:为此考虑使用循环而不是递归。

编辑:

要查找从该类型继承的父控件,您可以使用IsSubclassOf method

... AndAlso nextParent.GetType() <> pType AndAlso Not nextParent.GetType().IsSubclassOf(pType) Then ...

答案 1 :(得分:1)

我宁愿将Object更改为control,然后添加一个循环来查看所有级别,如下所示:

Public Function __GET_PARENT(ByVal current As Control, ByVal pType As Type) As Control
    Dim parent As Control = current.Parent
    While parent IsNot Nothing
        If pType.IsAssignableFrom(parent.GetType()) Then
            Return parent
        End If

        parent = parent.Parent
    End While
    Return Nothing
End Function

我的VB有点生疏,但这应该可以解决问题。

否则您可以使用泛型,因此您的返回类型不是对象/控件,而是Panel或您正在寻找的任何内容。然后你可以这样做:

Public Function __GET_PARENT(Of T As Control)(ByVal current As Control) As T
    Dim parent = current.Parent
    If (parent Is Nothing) Then
        Return Nothing
    End If
    If GetType(T).IsAssignableFrom(parent.GetType()) Then
        Return CType(parent, T)
    End If
    Return __GET_PARENT(Of T)(parent)
End Function

然后简单地按如下方式调用它:

Dim ctrl As Panel = __GET_PARENT(Of Panel)(Button1)