2010-04-04 5 views
2

J'ai un dossier public sur le serveur qui contient des sous-dossiers imbriqués récursivement. Dans les différents dossiers Leaf contient des images. Je voulais créer un navigateur de fichiers côté serveur qui affichera les images à l'utilisateur. J'utilise le ASP.NET TreeView Contrôle. Je crée les nœuds d'arbre à l'aide de PopulateOnDemand. Si l'utilisateur clique sur un répertoire de feuilles, je souhaite que les images de ce dossier soient affichées dans un contrôle DataList.Problème de contrôle TreeView

Le problème est que lorsque je clique sur un nœud de l'arbre secondaire (après que j'élargissions nœud parent) Tous les sous arbre disparaît et étendu que le nœud parent est montré sans signe + à côté !!

(je mets PopulateNodesFromClient de la propriété TreeView true)

Quelqu'un peut-il me dire quel est le problème ??

Merci

Voici le code:

<asp:TreeView ID="TreeView1" runat="server" AutoGenerateDataBindings="False" 
        onselectednodechanged="TreeView1_SelectedNodeChanged" 
        ontreenodepopulate="TreeView1_TreeNodePopulate"> 
       </asp:TreeView> 




protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
     string path = Server.MapPath("."); 
     PopulateTopNodes(path); 
    } 
} 

private void PopulateTopNodes(string pathToRootFolder) 
{ 
    DirectoryInfo dirInfo = new DirectoryInfo(pathToRootFolder); 
    DirectoryInfo[] dirs = dirInfo.GetDirectories(); 
    foreach (DirectoryInfo dir in dirs) 
    { 
     TreeNode folderNode = new TreeNode(dir.Name,dir.FullName); 

     if (dir.GetDirectories().Length > 0) 
     { 
      folderNode.PopulateOnDemand = true; 
      folderNode.Collapse(); 
     } 
     TreeView1.Nodes.Add(folderNode); 
    } 
} 


protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e) 
{ 

    if (IsCallback == true) 
    { 
     if (e.Node.ChildNodes.Count == 0) 
     { 
      LoadChildNode(e.Node); 
     } 
    } 


} 

private void LoadChildNode(TreeNode treeNode) 
{ 
    DirectoryInfo dirInfo = new DirectoryInfo(treeNode.Value); 
    DirectoryInfo[] dirs = dirInfo.GetDirectories(); 
    foreach (DirectoryInfo dir in dirs) 
    { 
     TreeNode folderNode = new TreeNode(dir.Name, dir.FullName); 
     if(dir.GetDirectories().Length>0){ 
      folderNode.PopulateOnDemand = true; 
      folderNode.Collapse(); 
     } 
     treeNode.ChildNodes.Add(folderNode); 
    } 
} 







protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e) 
{ 
    // Retrieve the images here 
} 

Répondre

1

Je ne chargez pas ont une réponse directe pour vous, mais vous êtes en train de faire quelque chose de mal puisque vous ne les nœuds Page_Load, et même seulement sur la première charge. Cela signifie que vous comptez sur ViewState pour enregistrer tous les nœuds entre les publications et bien, ce n'est pas la bonne façon de le faire.

Il me semble que vous êtes assez proche, cependant. Je voudrais supprimer le Page_Load et ensuite jeter un oeil au dernier exemple de cette page: http://msdn.microsoft.com/en-us/library/system.web.ui.webcontrols.treeview(VS.80).aspx.

+0

Cher Jan, Nous vous remercions de votre réponse. Lorsque la propriété TreeView.PopulateNodesFromClient est définie sur true (valeur par défaut), TreeView effectue un rappel côté client pour récupérer les noeuds dont il a besoin. Un noeud donné est renseigné une seule fois à la demande. Après cela, les valeurs restent disponibles sur le client et aucun rappel n'est effectué si le même nœud est réduit et développé. C'est ainsi que le contrôle est censé se comporter. (Peut-être que l'utilisation de l'événement SelectedNodeChanged avec PopulateNodesFromClient etc. est à l'origine de ce bogue?) Je vais jeter un coup d'œil sur l'exemple que vous recommandez. Merci – ProgNet

+0

J'ai pris mon exemple de [ici] (http://www.aspnettutorials.com/tutorials/controls/treeview-open-files-cs.aspx) – ProgNet

+0

Pour moi, il semble que la différence entre votre code et l'exemple est que tout ce qu'ils font dans Page_Load est configuré le nœud racine - tout le reste est rempli par les appels client. Vous chargez tous les nœuds dans Page_Load. –

0

J'ai eu le même problème exact et la définition de la propriété PopulateNodesFromClient = "false" l'a résolu.

éditer: la propriété du contrôle TreeView.