2013-10-30 2 views
1

난에있는 모든 컨트롤을 선택 오전 formtreeView 컨트롤의 모든 노드를 반복하는 방법. C#

컨트롤은 내가 같은 필요가

이있는 모든 노드 Treeviews 반복합니다 경우 : 를 (그리고 내 코드)

foreach (Control c in PanelSM.Controls) 
{ 
    if (c is TreeView) 
    {  
     TreeNodeCollection myNodes = c.Nodes;//<<<<< Here is a mistake 
     foreach (TreeNode n in myNodes) 
     { 
      String text = rm.GetString(n.Name); 
      //And more things 
      //... 
      //... 
      //... 
     } 
    } 
    //... 
} 

아이디어가 있으십니까?

당신은

+1

아아 .. 죄송합니다. 내 잘못이야. – David

+1

wait ...'((TreeView) c) .Nodes'가 필요합니다. –

+0

[이 도움말을합니까?] (http://msdn.microsoft.com/en-us/library/wwc698z7%28v=vs.90%29.aspx) –

답변

2

할 수

IEnumerable<TreeNode> Collect(TreeNodeCollection nodes) 
{ 
    foreach(TreeNode node in nodes) 
    { 
     yield return node; 

     foreach (var child in Collect(node.Nodes)) 
      yield return child; 
    } 
} 

을 충분해야 . 그것을 TreeView 유형으로 형변환해야합니다. 그것은 꽤 쉽게

if (c is TreeView) 
{ 
    TreeNodeCollection myNodes = ((TreeView) c).Nodes; // <<--- Note the cast 
    ... 
} 

또는

TreeView tv = c as TreeView; 
if (tv != null) 
{ 
     TreeNodeCollection myNodes = tv.Nodes; 
     ... 
} 
+0

정말 고마워! @elgonzo – Jean

16

당신은 재귀를 사용할 필요가 감사합니다. 이와 같은 방법은 당신의 실수가 c노드 멤버를 가지고 있지 않는, 실제로 형 Control의 변수라는 것이다 다음 당신의 방법에 당신은 그냥

foreach (var node in Collect(tree.Nodes)) 
{ 
    // you will see every child node here 
} 
+0

헤이 @Darren 코프 너무 감사합니다! ** 너 규칙! ** – Jean

6

:

이러한 두 가지 방법 중 하나를 수행 할 수

void TraverseTree(TreeNodeCollection nodes) 
{ 
    foreach (var child in nodes) 
    { 
     DoSomethingWithNode(child); 
     TraverseTree(child.Nodes); 
    } 
} 

그리고 그것을 호출

TraverseTree(MyTreeView.Nodes); 
+0

고맙습니다. @ Jim Mischel – Jean

0

대런의 큰 대답의 상단에이

foreach (TreeNode t in tvMenu.Nodes) 
    { 
     for (int iParent = 0; iParent < t.ChildNodes.Count; iParent++) 
     { 
      for (int iChild = 0; iChild < t.ChildNodes[iParent].ChildNodes.Count; iChild++) 
      { 
       if (t.ChildNodes[iParent].ChildNodes[iChild].Text == "") 
       { 

       } 
      } 
     } 
    } 
0

건물을하려고하면 재귀와 클래스 확장을 결합 할 수 있습니다. 어딘가에 네임 스페이스

선언 :

public static class MyExtensions 
{ 
    public static IEnumerable<TreeNode> All(this TreeNodeCollection nodes) 
    { 
     foreach(TreeNode n in nodes) 
     { 
      yield return n; 
      foreach(TreeNode child in n.Nodes.All()) 
       yield return child; 
     } 
    } 
} 

참고 "이"방법의 첫 번째 인수 전에.

은 그럼 당신은 모든 트 리뷰에서이 새로운 방법을 사용할 수 있습니다 :

foreach(TreeNode n in myTreeview.Nodes.All()) ... 
+0

대부분의 방법을 확장 메서드로 만들 수 있습니다. 실제로 여기를 확장 메서드로 바꾸는 것만으로 답을 얻는 것이 아닙니다. 그 꼭대기에 [당신이 시작하기 위해 트리를 탐색하기위한 특히 좋은 구현을 선택하지 않은 (http://stackoverflow.com/a/10253591/1159478). – Servy

1

나는 단순함을 선호하고, 여기 내 간단한 솔루션입니다 :

protected void TraverseNodes(TreeNodeCollection nodes, string action, int maxDepth = 2) 
    { 
     foreach (TreeNode node in nodes) 
     { 
      if (node.ChildNodes.Count > 0 && node.Depth < maxDepth) 
       TraverseNodes(node.ChildNodes, action, maxDepth); 

      //do something!!! 
      var x = node.Text; 
      node.Checked = !node.Checked; 
     } 
    } 

가 나는 "최대 깊이"를 포함하기로 결정 보너스로 즐기십시오.

전화를 다음과 같이 여기에 게시 예제의 일부와는 달리

   TraverseNodes(this.Activities.Nodes, ""); 

, 나는 실제로 (! 아야 나는 그 말을들을 수)이 테스트.

관련 문제