代码之家  ›  专栏  ›  技术社区  ›  pdavis

通过XML属性扩展ASP.NETTreeView中的节点

  •  3
  • pdavis  · 技术社区  · 16 年前

    ASP页面。。。

    <asp:XmlDataSource ID="oXmlDataSource" runat="server" />
    <asp:TreeView ID="TreeView1" runat="server" EnableViewState="false" DataSourceID="oXmlDataSource"></TreeView>
    

    oXmlDataSource.Data = MyXMLString;
    oXmlDataSource.XPath = "/Tree/Node";
    

    这是XML。。。

    <?xml version='1.0' encoding='utf-8' ?>
    <Tree Text='example.aspx' Href='example.aspx'>
          <Node Text='Example Node 1' Href='0800200c9a66.aspx' Expanded='false'></Node>
          <Node Text='Example Node 2' Href='0800200c9a66.aspx' Expanded='true'>
             <Node Text='Example Node 3' Href='0800200c9a66.aspx' Expanded='false'></Node>
             <Node Text='Example Node 4' Href='0800200c9a66.aspx' Expanded='false'></Node>
             <Node Text='Example Node 5' Href='0800200c9a66.aspx' Expanded='false'></Node>
             <Node Text='Example Node 6' Href='0800200c9a66.aspx' Expanded='false'></Node>
          </Node>
    </Tree>
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   PaulH PaulH    16 年前

    不幸的是,您不能在XML中这样做。这是短暂的失控。您将需要用XML填充TreeView,然后递归地遍历所有节点并展开所需的分支。请尝试以下操作:

    将OnPreRender属性添加到TreeView控件。。。

    <asp:XmlDataSource ID="oXmlDataSource" runat="server" />
    <asp:TreeView ID="TreeView1" runat="server" EnableViewState="false" DataSourceID="oXmlDataSource" OnPreRender="TreeView1_PreRender"></TreeView>
    

    protected void TreeView1_PreRender(object sender, EventArgs e)
    {
        SelectCurrentPageTreeNode(TreeView1);
    }
    
    private void SelectCurrentPageTreeNode(TreeView tvTreeView)
    {
        tvTreeView.CollapseAll();
    
        if (Request.Url.PathAndQuery != null)
        {
            ExpandTreeViewNodes(tvTreeView, Request.Url.PathAndQuery);
        }
    }
    
    private TreeNode ExpandTreeViewNodes(TreeView tvTreeView, string sPathAndQuery)
    {
        if (tvTreeView != null)
        {
            if (!string.IsNullOrEmpty(sPathAndQuery))
            {
                sPathAndQuery = sPathAndQuery.ToLower();
                {
                    TreeNode tnWorkTreeNode = null;
    
                    for (int iLoop = 0; iLoop < tvTreeView.Nodes.Count; iLoop++)
                    {
                        tvTreeView.Nodes[iLoop].Expand();
    
                        tvTreeView.Nodes[iLoop].Selected = true;
                        if (tvTreeView.Nodes[iLoop].NavigateUrl.ToLower() == sPathAndQuery)
                        {
                            return (tvTreeView.Nodes[iLoop]);
                        }
                        else
                        {
                            tnWorkTreeNode = ExpandTreeViewNodesR(tvTreeView.Nodes[iLoop], sPathAndQuery);
                        }
    
                        if (tnWorkTreeNode != null)
                        {
                            return (tnWorkTreeNode);
                        }
    
                        tvTreeView.Nodes[iLoop].Collapse();
                    }
                }
            }
        }
    
        return (null);
    }
    
    private static TreeNode ExpandTreeViewNodesR(TreeNode tvTreeNode, string sPathAndQuery)
    {
        TreeNode tnReturnTreeNode = null;
    
        if (tvTreeNode != null)
        {
            tvTreeNode.Expand();
            if (tvTreeNode.NavigateUrl.ToLower() == sPathAndQuery)
            {
                return (tvTreeNode);
            }
            else
            {
                tnReturnTreeNode = null;
    
                for (int iLoop = 0; iLoop < tvTreeNode.ChildNodes.Count; iLoop++)
                {
                    tvTreeNode.ChildNodes[iLoop].Selected = true;
                    tnReturnTreeNode = ExpandTreeViewNodesR(tvTreeNode.ChildNodes[iLoop], sPathAndQuery);
    
                    if (tnReturnTreeNode != null)
                    {
                        return (tnReturnTreeNode);
                    }
                }
                tvTreeNode.Collapse();
            }
        }
        return (null);
    }
    
        2
  •  0
  •   JerKimball    16 年前

    嗯……嗯,默认情况下,使用“Expanded”并不会让您到达任何地方,因为数据绑定甚至不会看到这一点……我想您可以设置某种自定义数据绑定,但我的建议是挂接到OnTerenodeDatabound事件,并根据需要在那里展开/折叠,尽管您的里程可能会因该方法而异。