3

ASP.Netマスターページのコントロールにアクセスする方法を学び、特定のTreeViewノードを展開しようとしています。マスターページではない別のページからこれを行っています。

objContentPlaceHolder、objLoginView、およびobjTreeViewはすべて、デバッガーを使用して確認された値を持ちます。

このコードを見て、forループのコードが実行されていない理由を教えてください。forループに到達しますが、その時点でforループをスキップします。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    Dim objContentPlaceHolder As ContentPlaceHolder
    Dim objLoginView As LoginView
    Dim objTreeView As TreeView

    objContentPlaceHolder = CType(Master.FindControl("ContentPlaceHolderBody"), ContentPlaceHolder)

    If Not objContentPlaceHolder Is Nothing Then

        objLoginView = CType(objContentPlaceHolder.FindControl("loginViewMain"), LoginView)

        If Not objLoginView Is Nothing Then
            objTreeView = CType(objLoginView.FindControl("TreeViewMain"), TreeView)

            ' Make sure all nodes for Maintenance are expanded.
            '--------------------------------------------------
            For Each treenode As TreeNode In objTreeView.Nodes
                If treenode.Text = "Maintenance" Then
                    treenode.Expand()
                End If
            Next treenode
        End If
    End If
End Sub

* アップデート *

ページ読み込みイベントハンドラーをPreRenderCompleteイベントハンドラーに変更しましたが、機能したと思いますか?PreRenderがそうしなかった理由はわかりませんが、それだけでした。皆様のご協力に改めて感謝いたします。

4

2 に答える 2

1
   public Sub TreeView_TreeNodeDataBound(ByVal sender As Object, ByVal e As TreeNodeEventArgs  )
       dim mapNode as SiteMapNode =  e.Node.DataItem as SiteMapNode
       If mapNode.Title = "Maintenance" then
           e.Node.Expand()
       End if
   End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        Dim objContentPlaceHolder As ContentPlaceHolder
        Dim objLoginView As LoginView
        Dim objTreeView As TreeView

        objContentPlaceHolder = CType(Master.FindControl("ContentPlaceHolderBody"), ContentPlaceHolder)

        If Not objContentPlaceHolder Is Nothing Then

            objLoginView = CType(objContentPlaceHolder.FindControl("loginViewMain"), LoginView)

            If Not objLoginView Is Nothing Then
                objTreeView = CType(objLoginView.FindControl("TreeViewMain"), TreeView)
                objTreeView.TreeNodeDataBound += TreeView_TreeNodeDataBound 
            End If
        End If
    End Sub

これがお役に立てば幸いです

于 2013-02-12T16:22:54.880 に答える
1

あなたの例から、あなたのロジックはルートノードのみをチェックしているように見えます。階層データを処理するときは、構造全体が確実に評価されるように再帰ロジックを採用する必要があります。

このようなものが必要です:

Protected Sub btnSearch_Click(sender As Object, e As EventArgs)
    For Each node As TreeNode In TreeView1.Nodes
        ExpandNodeByValue("Maintenance", node)
    Next
End Sub

Private Sub ExpandNodeByValue(value As String, parentNode As TreeNode)
    For Each childNode As TreeNode In parentNode.ChildNodes
        If childNode.Value.ToLower() = value.ToLower() Then
            childNode.Expand()
        End If
        If childNode.ChildNodes.Count > 0 Then
            ExpandNodeByValue(value, childNode)
        End If
    Next
End Sub

また、少なくとも一時的に、のDirectCast代わりに使用して、コントロールが確実に検出されるようにすることをお勧めします。CType次のように実装します。

Dim objTreeView as TreeView = DirectCast(objLoginView.FindControl("TreeViewMain"), TreeView)
If objTreeView IsNot Nothing Then
    'The control was found
End If
于 2013-02-12T16:25:35.407 に答える