0

我正在尝试创建一个函数来搜索 WebControl 的父子关系(基本上与 WebControl.FindControl(id as String) 相反,但要查找特定的 WebControl 类型)。

示例:我在 GridViewRow 的 ItemTemplate 中有一个用户控件。我正在尝试从用户控件中引用 GridViewRow。用户控件可能位于也可能不在 div 或其他类型的控件中,所以我不知道要查看多少父级(即我不能只使用 userControl.Parent.Parent)。我需要一个函数来找到它在父子层次结构中找到的第一个 GridViewRow。

因此需要这个功能。除非有更好的方法来做到这一点?无论如何,我希望我正在创建的函数相当通用,以便可以根据我正在寻找的内容指定不同的 WebControl 类型(即 GridViewRow、Panel 等)。这是我写的代码:

Public Function FindParentControlByType(ByRef childControl As WebControl, ByVal parentControlType As WebControl.Type, Optional ByRef levelsUp As Integer = Nothing) As WebControl
    Dim parentControl As WebControl = childControl
    Dim levelCount = 1
    Do While Not parentControl.GetType = parentControlType
        If Not levelsUp = Nothing AndAlso levelCount = levelsUp Then
            parentControl = Nothing
            Exit Do
        End If
        levelCount += 1
        parentControl = parentControl.Parent
    Loop
    parentControl.FindControl(
    Return parentControl
End Function

我知道函数定义中的“ByVal parentControlType as WebControl.Type”不起作用——这就是我要找的。

我相信有更好的方法可以做到这一点,所以请随时指出来让我看起来很简单!

多谢你们!

4

1 回答 1

1

您应该能够使用递归轻松地做到这一点。这是一个让您开始或可能解决您的问题的示例。

VB 语法不再那么好,但我相信你可以通过转换器运行它(如 converter.telerik.com)

C# 代码

public T FindParentControl<T>(
    ref WebControl child, 
    int currentLevel, 
    int maxLevels)
    where T : WebControl
{
    if (child.Parent == null || currentLevel > maxLevels)
        return null;

    if (child.Parent is T)
        return child.Parent as T;
    else 
        return FindParentControl<T>(
            child.Parent, 
            currentLevel + 1, 
            maxLevels);
}

VB.NET 代码(converter.telerik.com 提供)

Public Function FindParentControl(Of T As WebControl)(
    ByRef child As WebControl,
    currentLevel As Integer, 
    maxLevels As Integer) As T

    If child.Parent = Nothing OrElse currentLevel > maxLevels Then
        Return Nothing
    End If

    If TypeOf child.Parent Is T Then
        Return TryCast(child.Parent, T)
    Else
        Return FindParentControl(Of T)(child.Parent, currentLevel + 1, maxLevels)
    End If
End Function
于 2009-04-23T22:28:53.293 回答