2008-12-23 10 views
3

J'ai un contrôle TreeView ASP.Net que je lie à une source de données XML. Je veux pouvoir contrôler quels noeuds sont développés et lesquels sont réduits dans le fichier de définition XML. The Expanded = '' ne fonctionne pas pour moi cependant. Dans l'exemple simple suivant, je veux que le nœud 2 soit entièrement développé.Extension d'un noeud dans ASP.Net TreeView via l'attribut XML

page ASP ...

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

... Derrière

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

Voici le 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> 

Répondre

1

Malheureusement, vous ne pouvez pas le faire dans le XML. C'est une courte venue du contrôle. Vous devrez remplir le TreeView avec le XML, puis traverser récursivement tous les nœuds et développer la branche dont vous avez besoin. Effectuez les opérations suivantes:

Ajouter le attrobite OnPreRender au contrôle TreeView ...

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

ajouter ensuite les éléments suivants au code derrière (je vous recommande d'ajouter des tests et l'ajout try/prises) ...

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

Hmm ... eh bien, en utilisant " Expanded "ne vous obtiendra pas n'importe où par défaut, puisque DataBinding ne regardera même pas cela ... Je suppose que vous pourriez mettre en place une sorte de DataBinding personnalisé, mais mon suggestion ion serait de se connecter à l'événement OnTreeNodeDataBound et de le développer/réduire au besoin, bien que votre kilométrage puisse varier avec cette approche. Votre problème tourne autour de la façon dont la liaison de données pour l'arborescence se produit: Si Reflector est pratique, consultez la méthode DataBindRecursive sur le contrôle TreeView. Si vous n'avez pas de réflecteur à portée de main, installez-le. :)