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

関数定義の「ByValparentControlTypeasWebControl.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 に答える