2012-09-02 46 views
3

我需要基於C#中的FULLPATH擴大我的TreeView樹狀如何擴大FULLPATH

我的樹視圖具有被倒塌2個節點,我想擴大Node A數點3 所以我的FULLPATH節點A\1\2\3

如何逐步完成基於完整路徑的每個節點?此外,完整路徑的長度可能會發生變化,所以我可能需要打開節點爲級別6。所以需要根據完整路徑完成。任何幫助都會很棒。

Node A 
     1 
     2 
      3 
Node B 
1 
2 
    3 
    4 5 6 

這是我已經試過:

TreeNode [] n= treeView1.Nodes.Find(search, true); 

if (n.Length > 0) 
    found = true; 
treeView1.Nodes[t].Collapse(); 
foreach (TreeNode p in n) { 
    string[] a = p.FullPath.Split('\\'); 
    foreach (string b in a) { 
    treeView1.SelectedNode = treeView1.Nodes[b]; 
    treeView1.SelectedNode.Expand(); 
+0

我試圖分裂的完整路徑,然後做一個對每個擴大各節點,但一旦進入到第二個循環是錯誤的,因爲我想的話,我需要有像treeview1.nodes [B [ 0]]。節點[b [1]] –

+0

或在第二個循環中選擇子節點的方法 –

+0

遞歸是這裏的解決方案@KevinBabb – S3ddi9

回答

0

破解了!

TreeNode[] n = treeView1.Nodes.Find(search, true); 
      if (n.Length > 0) 
       found = true; 
      treeView1.Nodes[t].Collapse(); 

      foreach (TreeNode p in n) 
      { 
       i = 0; 
       string[] a = p.FullPath.Split('\\'); 
       foreach (string b in a) 
       { 

        if (i == 0) 
        { 

         treeView1.SelectedNode = treeView1.Nodes[b]; 
         current = treeView1.Nodes[b]; 
         treeView1.SelectedNode.Expand(); 
         i = 1; 
        } 
        else 
        { 
         treeView1.SelectedNode = current.Nodes[b]; 
         current = current.Nodes[b]; 
         treeView1.SelectedNode.Expand(); 


         if (b.ToUpper().Contains(search)) 
         { 
          treeView1.SelectedNode.BackColor = System.Drawing.Color.Red; 
         } 
1

我希望這將是更簡單,爲樹視圖最好的方法是使用遞歸方法

... 
     string path = @"A\1\2\"; 

     var path_list = path.Split('\\').ToList(); 
     foreach (TreeNode node in treeView1.Nodes) 
      if (node.Text == path_list[0]) 
       ExpandMyLitleBoys(node, path_list); 



    } 

    private void ExpandMyLitleBoys(TreeNode node, List<string> path) 
    { 
     path.RemoveAt(0); 

     node.Expand(); 

     if (path.Count == 0) 
      return; 

     foreach (TreeNode mynode in node.Nodes) 
      if (mynode.Text == path[0]) 
       ExpandMyLitleBoys(mynode, path); //recursive call 


    } 

這並不完全

3

對不起了工作不要評論S3ddi9給出的正確答案。我只是增加了一些東西,但不能評論(聲望lvl50)。

因此,通過S3ddi9

給出
... 
    string path = @"A\1\2\"; 

    var path_list = path.Split('\\').ToList(); 
    foreach (TreeNode node in treeView1.Nodes) 
     if (node.Text == path_list[0]) 
      ExpandMyLitleBoys(node, path_list); 
} 

private void ExpandMyLitleBoys(TreeNode node, List<string> path) 
{ 
    path.RemoveAt(0); 

    node.Expand(); 

    if (path.Count == 0) 
     return; 

    foreach (TreeNode mynode in node.Nodes) 
     if (mynode.Text == path[0]) 
      { 
      ExpandMyLitleBoys(mynode, path); //recursive call 
      break; //this was missing in earlier answer 
      } 

} 

答案的工作,但你必須添加一個BREAK(我將其標記),因爲如果for循環沒有完成,return;不會返回到您的主要功能,它會拋出你的例外,因爲path[0]null

0

我寫了一個更簡單的例程,很好用。沒有遞歸在所有... 這裏假設你的路徑是一個完整的文件路徑一樣......「C:\ Program Files文件\ MYAPP」,當你把你的節點設置節點關鍵等於文件夾名稱

string[] strFolders = strPath.Split('\')); 
 
System.Windows.Forms.TreeNode CurrentNode = null; 
 
System.Windows.Forms.TreeNode[] FoundNodes = null; 
 
foreach (string folder in strFolders) { 
 
\t if (!folder.Contains(":")) { 
 
\t \t if (CurrentNode == null) { 
 
\t \t \t FoundNodes = treeFolders.Nodes.Find(folder, false); 
 
\t \t } else { 
 
\t \t \t FoundNodes = CurrentNode.Nodes.Find(folder, false); 
 
\t \t } 
 
\t \t if (FoundNodes.Length > 0) { 
 
\t \t \t CurrentNode = FoundNodes[0]; 
 
\t \t \t CurrentNode.Expand(); 
 
\t \t } else { 
 
\t \t \t //no folder found. cant continue 
 
\t \t \t break; 
 
\t \t } 
 
\t } 
 
} 
 
if (CurrentNode != null) { 
 
\t treeFolders.SelectedNode = CurrentNode; 
 
}

0

這是代碼中,我提出以擴大在目錄一個TreeView。

1:我從目錄中刪除「:」,並將路徑拆分成目錄名字符串列表。

2:我調用一個方法,使用遞歸搜索當前節點中的目錄,並使用索引來跟蹤當前目錄。

3:當我找到一個目錄時,我展開該節點,然後重新調用該方法以繼續查找匹配項。

private void button1_Click(object sender, EventArgs e) 
    { 
     List<string> txtNodes = (@"C:\AMD\WU-CCC2".Replace(":", "")).Split(Convert.ToChar(@"\")).ToList<string>(); 

     expandNodes(treeView1.Nodes, txtNodes, 0); 

    } 

    public void expandNodes(TreeNodeCollection nodes, List<string> txtNodes, int index) 
    { 

     string txtnode = txtNodes[index]; 
     foreach (TreeNode node in nodes) 
     { 
      if (node.Text == txtnode) 
      { 
       node.Expand(); 
       if (txtNodes.Count> index +1) 
       { 
        expandNodes(node.Nodes, txtNodes, ++index); 
       } 
      } 
     } 
    }