Передача определенного типа WebControl в качестве параметра в VB.net - PullRequest
0 голосов
/ 24 апреля 2009

Я пытаюсь создать функцию, которая ищет отношения родитель-потомок WebControl (в основном противоположно WebControl.FindControl (id as String), но ищет определенный тип WebControl).

Пример: У меня есть элемент управления в ItemTemplate для GridViewRow. Я пытаюсь ссылаться на 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" в определении функции не будет работать - это то, что я ищу.

Я уверен, что есть лучший способ сделать это, поэтому, пожалуйста, не стесняйтесь, чтобы я выглядел просто, указав на это!

Спасибо, ребята!

1 Ответ

1 голос
/ 24 апреля 2009

Вы должны быть в состоянии сделать это легко, используя рекурсию. Вот пример, с которого можно начать или, возможно, решить вашу проблему.

уже не так хорош в синтаксисе 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
...