2008-12-23 72 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方法。如果你沒有方便的反射器,去安裝它。 :)