2011-05-20 91 views
0

我正在使用以下代碼將文件夾的內容轉換爲TreeView。但是當前的代碼總是將內容添加到TreeView的根目錄。它不會將它們添加爲父文件夾節點的子節點。獲取文件夾到樹形視圖

你能幫我嗎?

void Recurse(string path) 
{ 
    DirectoryInfo info = new DirectoryInfo(path); 
    TreeNode root = new TreeNode(info.Name); 
    string[] sub = Directory.GetDirectories(info.FullName); 
    TreeNode node = new TreeNode(); 
    MailTree.Nodes.Add(root); 
    if (sub.Length == 0) { 

    } 
    else 
    { 
     foreach(string i in sub) 
     {  
      DirectoryInfo subinfo = new DirectoryInfo(i);      
      root.Nodes.Add(subinfo.Name);      
      Recurse(i);     
     } 
     //MailTree.Nodes.Add(root); 
    } 
} 

回答

1

函數的遞歸部分總是將子節點添加到根。您需要添加「父節點」作爲遞歸函數的參數。類似這樣的:

void Recurse(string path, TreeNode parentNode) 
{ 
    DirectoryInfo info = new DirectoryInfo(path); 
    TreeNode node = new TreeNode(info.Name); 

    if (parentNode == null) 
     MailTree.Nodes.Add(node); 
    else 
     parentNode.Nodes.Add(node); 

    string[] sub = Directory.GetDirectories(path); 
    if (sub.Length != 0) 
    { 
     foreach(string i in sub) 
     {  
      Recurse(i, node);     
     } 
    } 
} 
0

乍一看,我不能在代碼中發現任何錯誤,但我可以建議採取另一種方法:您顯示的代碼太昂貴了。只需在樹上填上一層,然後在添加的每個節點中放置一些虛擬物品作爲葉子。然後攔截NodeExpanding事件,刪除虛擬節點並添加子節點(遞歸應用添加虛擬子節點的相同策略)

2

您應該傳遞一個根節點作爲Rescure方法的一部分,如Rescure(string path, TreeNode currentRoot)。現在

,你可以調用currentRoot.Nodes.Add(root)代替MailTree.Nodes.Add(root),這將確保brances只添加到當前的水平。您還需要將環路中的呼叫更改爲Rescure(i, root)

最後,您對Rescure的初始調用應該包括對預先創建的根節點的引用,所以類似於Rescure(initialDirectory, initialRootNode)

我想補充的一件事是你的方法和變量名稱應該改變以反映它們的含義。是的,你正在遞歸,但爲什麼?該方法的更好名稱可能是TraverseDirectory。同樣,而不是foreach(string i in sub),爲什麼不是foreach(string directoryName in sub)?清晰的代碼與正確的代碼幾乎同等重要。