2009-03-23 10 views
8

Je travaille avec des systèmes de fichiers et j'ai une liste <> d'objets fichier dont le chemin de fichier est une propriété. Fondamentalement, je dois créer un TreeView dans .NET, mais im du mal à penser à la meilleure façon de s'y prendre comme je l'ai besoin de créer une structure arborescente à partir d'une liste comme:Système de fichiers TreeView

C:/WINDOWS/Temp/ErrorLog.txt 
C:/Program Files/FileZilla/GPL.html 
C:/Documents and Settings/Administrator/ntuser.dat.LOG 

etc ....

La liste n'est pas structurée du tout et je ne peux pas apporter de modifications à la structure actuelle de l'objet.

Je travaille en C#.

Un grand merci pour tous ceux qui contribuent

+0

double possible de [remplir TreeView à partir d'une liste de chemin] (http://stackoverflow.com/questions/1155977/populate-treeview-from-a-list-of-path) –

Répondre

16

Si vous voulez coller avec les cordes quelque chose comme ça fonctionnerait ...

TreeNode root = new TreeNode(); 
TreeNode node = root; 
treeView1.Nodes.Add(root); 

foreach (string filePath in myList) // myList is your list of paths 
{ 
    node = root; 
    foreach (string pathBits in filePath.Split('/')) 
    { 
     node = AddNode(node, pathBits); 
    } 
} 


private TreeNode AddNode(TreeNode node, string key) 
{ 
    if (node.Nodes.ContainsKey(key)) 
    { 
     return node.Nodes[key]; 
    } 
    else 
    { 
     return node.Nodes.Add(key, key); 
    } 
} 
+0

c'est b-e-a-utiful! Merci beaucoup monsieur monsieur! – user31849

+0

Son ne fonctionne pas pour le Web? Quelqu'un peut-il m'aider à ce sujet? –

+0

Génial; exactement ce dont j'avais besoin. Le seul changement que je devais faire était de changer 'filePath.Split ('/')' en 'filePath.Split ('/', StringSplitOptions.RemoveEmptyEntries)' pour mes besoins. Je vous remercie! –

4

je tournerais la chaîne en FileInfo. Une fois que vous avez l'objet FileInfo, vous pouvez utiliser la propriété Directory pour récupérer le DirectoryInfo pour chaque chemin.

Une fois que vous avez le DirectoryInfo pour le chemin, il est facile de « marcher » la référence des parents dans DirectoryInfo pour transformer chaque chemin dans une liste de répertoires + nom de fichier - à savoir:

{"C:","Windows","Temp","ErrorLog.txt"} 

Cela devrait être assez simple à insérer dans votre treeview. Cherchez simplement chaque section du chemin à son tour, et si elle n'existe pas, ajoutez-la ...

2

Essayez la récursivité.

private void AddFiles() 
{ 
    // Iterate your list with FileInfos here 
    foreach(var fileInfo in new Collection<FileInfo>()) 
    { 
    GetOrCreateTreeNode(fileInfo.Directory).Nodes.Add(new TreeNode(fileInfo.Name)); 
    } 
} 

private TreeNode GetOrCreateTreeNode(DirectoryInfo directory) 
{ 
    if(directory.Parent == null) 
    { 
    // Access your TreeView control here: 
    var rootNode = <TreeView>.Nodes[directory.Name]; 
    if(rootNode == null) 
    { 
     rootNode = new TreeNode(directory.Name); 
     // Access your TreeView control here: 
     <TreeView>.Nodes.Add(rootNode); 
    } 
    return rootNode; 
    } 

    var parent = GetOrCreateTreeNode(directory.Parent); 
    var node = parent.Nodes[directory.Name]; 
    if(node == null) 
    { 
    node = new DirectoryNode(directory); 
    parent.Nodes.Add(node); 
    } 
    return node; 
} 

Ce code devrait vous donner seulement une idée - je dois admettre que je ne l'ai pas le tester avant de poster ici.

+0

Dans la méthode GetOrCreateTreeNode , à quoi sert la ligne Directories.Nodes [directory.Name]? Comme il n'y a rien de tel que les répertoires .... Votre aide jusqu'à présent est très appréciée! – user31849

+0

Voir les corrections - c'est l'élément , trop – tanascius

+0

Merci, je pensais que ce serait cela mais je voulais m'assurer que – user31849

2
private void Form1_Load(object sender, EventArgs e) 
    { 
     var paths = new List<string> 
         { 
          @"C:\WINDOWS\AppPatch\MUI\040C", 
          @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727", 
          @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MUI", 
          @"C:\WINDOWS\addins", 
          @"C:\WINDOWS\AppPatch", 
          @"C:\WINDOWS\AppPatch\MUI", 
          @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\MUI\0409" 
         }; 
     treeView1.PathSeparator = @"\"; 
     PopulateTreeView(treeView1, paths, '\\'); 
    } 

    private static void PopulateTreeView(TreeView treeView, IEnumerable<string> paths, char pathSeparator) 
    { 
     TreeNode lastNode = null; 
     string subPathAgg; 
     foreach (string path in paths) 
     { 
      subPathAgg = string.Empty; 
      foreach (string subPath in path.Split(pathSeparator)) 
      { 
       subPathAgg += subPath + pathSeparator; 
       TreeNode[] nodes = treeView.Nodes.Find(subPathAgg, true); 
       if (nodes.Length == 0) 
        if (lastNode == null) 
         lastNode = treeView.Nodes.Add(subPathAgg, subPath); 
        else 
         lastNode = lastNode.Nodes.Add(subPathAgg, subPath); 
       else 
        lastNode = nodes[0]; 
      } 
     } 
    } 

alt text

+0

-1 Trouvé le parent incorrect dans plusieurs situations où la solution de Paul a fonctionné. –

0

pièce de EHosca a fonctionné pour moi parfaitement, avec un seul changement - je dû mettre lastnode à rien après le chemin foreach dans la zone de chemins.

Il s'agit du code d'eHosca ci-dessus, porté sur VB.

Private Sub PopulateTreeView(tv As TreeView, paths As List(Of String), pathSeparator As Char) 
    Dim lastnode As TreeNode = Nothing 
    Dim subPathAgg As String 
    For Each path In paths 
     subPathAgg = String.Empty 
     lastnode = Nothing 
     For Each subPath In path.Split(pathSeparator) 
      subPathAgg += subPath + pathSeparator 
      Dim nodes() As TreeNode = tv.Nodes.Find(subPathAgg, True) 
      If nodes.Length = 0 Then 
       If IsNothing(lastnode) Then 
        lastnode = tv.Nodes.Add(subPathAgg, subPath) 
       Else 
        lastnode = lastnode.Nodes.Add(subPathAgg, subPath) 
       End If 
      Else 
       lastnode = nodes(0) 
      End If 
     Next 
    Next 
End Sub 
Questions connexes