2008-12-23 74 views
3

我有一个ASP.Net TreeView控件,它绑定到XML数据源。我希望能够控制XML定义文件中展开哪些节点以及哪些节点已折叠。 Expanded =''虽然对我不起作用。在下面的简单示例中,我希望节点2完全展开。通过XML属性扩展ASP.Net TreeView中的节点

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> 

回答

1

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

添加的OnPreRender attrobite 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); 
} 
0

嗯......嗯,用“扩展“不会让你默认的任何地方,因为DataBinding甚至不会看到...我想你可以设置某种自定义的DataBinding,但我的建议离子将钩入OnTreeNodeDataBound事件并根据需要展开/折叠,尽管您的里程可能会因此而有所不同。

您的问题围绕树视图的数据绑定发生的方式展开:如果您有方便的Reflector,请检查TreeView控件上的DataBindRecursive方法。如果你没有方便的反射器,去安装它。 :)