我正在尝试使用以下函数来获取元素的父对象。
'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。
答案 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)