2009-03-23 13 views
8

Pracuję z systemami plików i mam listę obiektów o ścieżce pliku jako właściwość. Zasadniczo trzeba utworzyć TreeView w .NET, ale im stara się wymyślić najlepszy sposób, aby to zabrać jak trzeba utworzyć strukturę drzewa z listy jak:System plików TreeView

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

itp ....

Lista nie jest w ogóle ustrukturyzowana i nie mogę wprowadzić żadnych zmian w obecnej strukturze obiektu.

Pracuję w języku C#.

Wielkie dzięki dla wszystkich, którzy przyczyniają

+0

Możliwe duplikat [wypełnienia z listy katalogów ścieżki] (http://stackoverflow.com/questions/1155977/populate-treeview-from-a-list-of-path) –

Odpowiedz

16

Jeśli chciał trzymać się z ciągów coś takiego to będzie działać ...

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

to jest b-e-a-en! Dziękuję bardzo życzliwy panie! – user31849

+0

Nie działa dla Internetu? Czy ktoś może mi pomóc w tej sprawie? –

+0

Awesome; dokładnie to, czego potrzebowałem. Jedyną zmianą, jakiej musiałem dokonać, to zmiana 'filePath.Split ('/')' na 'filePath.Split ('/', StringSplitOptions.RemoveEmptyEntries) dla moich celów. Dziękuję Ci! –

4

chciałbym zwrócić ciąg do FileInfo.

Po utworzeniu obiektu FileInfo można użyć właściwości Katalog, aby pobrać DirectoryInfo dla każdej ścieżki.

Gdy masz DirectoryInfo na ścieżce, to łatwo „chodzić” odwołanie dominującym w DirectoryInfo obrócić każdą ścieżkę do listy katalogów + filename - czyli:

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

To powinno być dość proste, aby wstawić do twojego widoku drzewa. Poszukaj po kolei każdej sekcji ścieżki, a jeśli nie istnieje, dodaj ją ....

2

Podaj próbę rekursji.

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; 
} 

Ten kod powinien dać ci tylko pomysł - muszę przyznać, że nie przetestowałem go przed opublikowaniem tutaj.

+0

W sposobie GetOrCreateTreeNode , co to jest linia Directories.Nodes [directory.Name]? Ponieważ nie ma czegoś takiego jak katalogi .... Twoja pomoc do tej pory jest bardzo doceniana! – user31849

+0

Zobacz korekty - to jest element , również – tanascius

+0

Dziękuję, myślałem, że to będzie to, ale chciałem się upewnić, że – 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 Znaleziono niepoprawnego rodzica w kilku sytuacjach, w których rozwiązanie Paula zadziałało. –

0

kawałek EHosca pracował dla mnie idealnie, z jedną zmianą - Musiałem ustawić lastnode do nic po ścieżce foreach w obszarze ścieżek.

To jest kod eHosca powyżej, przeniesiony do 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