2009-03-23 44 views
8

Tôi đang làm việc với các hệ thống tệp và tôi có Danh sách các đối tượng tệp có đường dẫn tệp là thuộc tính. Về cơ bản tôi cần phải tạo ra một treeview trong .NET nhưng im đấu tranh để nghĩ ra cách tốt nhất để đi về việc này như tôi cần phải tạo ra một cấu trúc cây từ một danh sách như:Hệ thống tệp TreeView

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

vv ....

Danh sách không được cấu trúc chút nào và tôi không thể thực hiện bất kỳ thay đổi nào đối với cấu trúc đối tượng hiện tại.

Tôi đang làm việc trong C#.

Rất cám ơn cho tất cả những ai đóng góp

+0

có thể trùng lặp của [cư treeview từ một danh sách các path] (http://stackoverflow.com/questions/1155977/populate-treeview-from-a-list-of-path) –

Trả lời

16

Nếu bạn muốn gắn bó với các dây một cái gì đó như thế này sẽ làm việc ...

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

điều này thật tuyệt vời! Thankyou rất nhiều loại sir! – user31849

+0

Nó không làm việc cho Web? Bất cứ ai có thể giúp tôi về điều này? –

+0

Tuyệt vời; chính xác những gì tôi cần. Thay đổi duy nhất tôi cần thực hiện là thay đổi 'filePath.Split ('/')' thành 'filePath.Split ('/', StringSplitOptions.RemoveEmptyEntries)' cho mục đích của tôi. Cảm ơn bạn! –

4

tôi sẽ biến chuỗi thành một FileInfo.

Khi bạn có đối tượng FileInfo, bạn có thể sử dụng thuộc tính Thư mục để truy xuất DirectoryInfo cho mỗi đường dẫn.

Khi bạn có DirectoryInfo cho đường dẫn, thật dễ dàng để "đi lên" tài liệu tham khảo Phụ huynh DirectoryInfo để biến mỗi đường dẫn vào một danh sách các thư mục + filename - ví dụ:

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

này nên được khá đơn giản để chèn vào treeview của bạn. Chỉ cần tìm kiếm từng phần của đường dẫn lần lượt và nếu nó không tồn tại, hãy thêm nó ....

2

hãy thử đệ quy.

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

Mã này chỉ cho bạn ý tưởng - Tôi phải thừa nhận rằng tôi đã không kiểm tra trước khi đăng bài ở đây.

+0

Trong phương pháp GetOrCreateTreeNode , dòng Directories.Nodes [directory.Name] có nghĩa là gì? Vì không có những thứ như Thư mục .... Sự giúp đỡ của bạn cho đến nay được rất nhiều đánh giá cao! – user31849

+0

Xem sửa đổi - đây là phần tử , quá – tanascius

+0

Cảm ơn bạn, tôi nghĩ rằng nó sẽ là vậy nhưng tôi muốn chắc chắn rằng – 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 Tìm thấy cha mẹ không chính xác trong một số tình huống mà giải pháp của Paul làm việc. –

0

mảnh EHosca của làm việc cho tôi một cách hoàn hảo, với một sự thay đổi - tôi đã phải thiết lập lastnode không có gì sau đường dẫn foreach trong khu vực đường dẫn.

Đây là mã eHosca ở trên, được chuyển đến 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 
Các vấn đề liên quan