【问题标题】:Expanding an ASP.Net TreeView node from code-behind从代码隐藏扩展 ASP.Net TreeView 节点
【发布时间】:2013-02-13 03:09:05
【问题描述】:

我正在学习如何访问 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 没有,但就是这样。再次感谢大家的帮助。

【问题讨论】:

    标签: asp.net vb.net treeview code-behind expand


    【解决方案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
    

    希望这会有所帮助

    【讨论】:

    • 感谢代码示例。我会试一试,然后告诉你它是如何工作的。
    • 我发现“expandTreeNode(treenode)”不会执行,因为它在被跳过的for循环中。
    • @Emad-ud-deen 我猜你的树视图当时没有绑定,你应该在 pre_render 事件处理程序中移动这段代码
    • 好的,我会试试的。 TreeView 是从 Web.sitemap 文件设置的。
    • 刚改成pre_render handler,for循环还在被跳过。
    【解决方案2】:

    从您的示例来看,您的逻辑似乎只检查根节点。在处理分层数据时,您需要使用递归逻辑来确保对整个结构进行评估。

    你需要这样的东西:

    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
    

    【讨论】:

    • 感谢您的回复。是的,它是根节点。如果可能,我们想只扩展根节点“维护”。我可以从母版页的代码隐藏文件中折叠“维护”节点,但是从不是母版页的页面访问 TreeView 时展开它们似乎很棘手。我尝试了代码,但它无法识别“.Tag”。
    • 我将 node.Tag.ToString() 更改为 node.Text.ToString() 因为我认为这就是您想要展示的内容。您还可以显示 FindChildNode() 的编码吗?
    • 我根据您的代码仅使用“for each”尝试了此操作: objTreeView = CType(objLoginView.FindControl("TreeViewMain"), TreeView) For Each node As TreeNode In objTreeView.Nodes Next but the “for each”被跳过。
    • 您确定它找到了控件吗?另外,请确认在您执行代码时控件已被填充。
    • 是的,非常确定,因为我在 For 循环上放置了一个断点,当我执行“步入”时,它只是跳出循环,从不触及“下一个”语句。如果每个人都可以,如果需要,我将发布 TreeView 的所有编码。
    猜你喜欢
    • 2012-01-02
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2010-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    相关资源
    最近更新 更多