递归循环获取对象的父对象
Recursive loop to get the parent of an object
我正在尝试使用以下函数获取元素的父对象。
'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 参数,它应该 return 实际的面板对象。
在比较 TypeOf nextParent is pType 时出现错误,提示未定义 pType。
Is
运算符将类型作为第二个参数,而不是 Type
对象。
获取控件的类型并与 Type
对象进行比较:
... AndAlso nextParent.GetType() <> pType Then ...
旁注:考虑 simpy 使用循环而不是递归。
编辑:
要同时查找继承自该类型的父控件,您可以使用 IsSubclassOf
method:
... AndAlso nextParent.GetType() <> pType AndAlso Not nextParent.GetType().IsSubclassOf(pType) Then ...
我宁愿将对象更改为控件,然后添加一个循环来查看所有级别,如下所示:
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 有点生疏,但这应该可以解决问题。
否则您可以使用泛型,这样您的 return 类型就不是对象/控件,而是面板或您要查找的任何类型。那么你可以这样做:
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)
我正在尝试使用以下函数获取元素的父对象。
'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 参数,它应该 return 实际的面板对象。
在比较 TypeOf nextParent is pType 时出现错误,提示未定义 pType。
Is
运算符将类型作为第二个参数,而不是 Type
对象。
获取控件的类型并与 Type
对象进行比较:
... AndAlso nextParent.GetType() <> pType Then ...
旁注:考虑 simpy 使用循环而不是递归。
编辑:
要同时查找继承自该类型的父控件,您可以使用 IsSubclassOf
method:
... AndAlso nextParent.GetType() <> pType AndAlso Not nextParent.GetType().IsSubclassOf(pType) Then ...
我宁愿将对象更改为控件,然后添加一个循环来查看所有级别,如下所示:
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 有点生疏,但这应该可以解决问题。
否则您可以使用泛型,这样您的 return 类型就不是对象/控件,而是面板或您要查找的任何类型。那么你可以这样做:
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)