2013-04-24 1 views
2

를 트 리뷰하기 '.'매개 변수가있는 모든 문자열을 동적으로로드 된 노드에 문제가 있습니다. 아마 어떤 종류의 foreach를 사용해야합니다 ...구분 기호로 분리 된 문자열이 같은 입력 스트림 뭔가를 C#

레코드 ID와 GroupName이있는 이전 데이터베이스 테이블 "group"이 있습니다. 이 문자열로 채워져 있습니다. John.Element 또는 Vanesa와 같은 일종의 "주소"를 만들어야합니다 .New.Element 또는 Josh.New.Under.Element, Element는 다른 datatable의 레코드입니다. DB를 연결은 문제가이 동적으로 포함하지 않는 지금 내가 추가를 완료 한 문자열의 나무

을 기입하고, 문제가 아니다 '.':

reader = readGroups.ExecuteNonQuery(); 
    while(reader.Read()) 
    { 
     string[] buff = reader.GetValue(1).ToString().Split('.'); 
     if (buff.Length == 1) 
     { 
      treeView1.Nodes[0].Nodes.Add(reader.GetValue(1)); 
     } 
     else 
     { 
      //group contains '.' 
     } 
    } 

편집 : 내가 가진 하나 더 문제. John, John.New, John.Old, John.Older, John.Oldest ... AddNodes() 메서드가 실행되면 메서드의 끝 부분에있는 foreach가 John을 지 웁니다 .New, John. 올드, 존. 올드 노드.하지만 그들은 treenode John으로 가야 해. 당신은 어떤 생각을 가지고 있다면 ...

+0

문자열 목록/배열/열거 가능 등을 가지며 treev에 노드를 추가해야합니다. 그러나 자식 노드를 추가하고 자식 노드를 추가하는 방법을 알아내는 데 문제가 있습니까? 정확한 질문이 무엇인지 모르겠습니다. – Charles380

+0

http://stackoverflow.com/questions/6280524/how-to-add-nodes-to-a-treeview-programatically 시작 하시겠습니까? – Charles380

+0

또한이 WPF 또는 winforms입니까? – Charles380

답변

1

이 당신이 필요합니다 것입니다. 재귀를 사용하여 각 부모 노드 안에 각 자식 노드를 추가하고 있습니다. 그리고 실제 트리 뷰에 노드를 추가하기 전에 고유 한 노드 목록을 만들도록 변경했습니다.

  internal class TreeNodeHierachy 
    { 
     public int Level { get; set; } 
     public TreeNode Node { get; set; } 
     public Guid Id { get; set; } 
     public Guid ParentId { get; set; } 
     public string RootText { get; set; } 
    } 

    private List<TreeNodeHierachy> overAllNodeList; 

    private void AddNodes(IEnumerable<string> data) 
    { 
     overAllNodeList = new List<TreeNodeHierachy>(); 
     foreach (var item in data) 
     { 
      var nodeList = new List<TreeNodeHierachy>(); 
      var split = item.Split('.'); 
      for (var i = 0; i < split.Count(); i++) 
      { 
       var guid = Guid.NewGuid(); 
       var parent = i == 0 ? null : nodeList.First(n => n.Level == i - 1); 
       var root = i == 0 ? null : nodeList.First(n => n.Level == 0); 
       nodeList.Add(new TreeNodeHierachy 
        { 
         Level = i, 
         Node = new TreeNode(split[i]) { Tag = guid }, 
         Id = guid, 
         ParentId = parent != null ? parent.Id : Guid.Empty, 
         RootText = root != null ? root.RootText : split[i] 
        }); 
      } 

      // figure out dups here 
      if (!overAllNodeList.Any()) 
      { 
       overAllNodeList.AddRange(nodeList); 
      } 
      else 
      { 
       nodeList = nodeList.OrderBy(x => x.Level).ToList(); 
       for (var i = 0; i < nodeList.Count; i++) 
       { 

        var existingNode = overAllNodeList.FirstOrDefault(
         n => n.Node.Text == nodeList[i].Node.Text && n.Level == nodeList[i].Level && n.RootText == nodeList[i].RootText); 
        if (existingNode != null && (i + 1) < nodeList.Count) 
        { 

         nodeList[i + 1].ParentId = existingNode.Id; 
        } 
        else 
        { 
         overAllNodeList.Add(nodeList[i]); 
        } 
       } 
      } 
     } 

     foreach (var treeNodeHierachy in overAllNodeList.Where(x => x.Level == 0)) 
     { 
      treeView1.Nodes.Add(AddChildNodes(treeNodeHierachy)); 
     } 
    } 

    private TreeNode AddChildNodes(TreeNodeHierachy node) 
    { 
     var treeNode = node.Node; 
     foreach (var treeNodeHierachy in overAllNodeList.Where(n => n.ParentId == node.Id)) 
     { 
      treeNode.Nodes.Add(AddChildNodes(treeNodeHierachy)); 
     } 
     return treeNode; 
    } 


    /// <summary> 
    /// Handles the Click event of the button1 control. 
    /// </summary> 
    /// <param name="sender">The source of the event.</param> 
    /// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param> 
    private void button1_Click(object sender, EventArgs e) 
    { 
     //SearchActiveDirectoryWithCriteria("(mailnickname=TM418)"); 

     var test = new List<string> 
      { 
       "John", 
       "Peter", 
       "Vanesa", 
       "Vanesa.New", 
       "Josh", 
       "Josh.New", 
       "Josh.New.Under", 
       "Josh.Old" 
      }; 

     AddNodes(test);   
    } 
+0

바네사가 가진 바를 말하면 노드를 제거하지 않고 다시 사용하도록 수정 될 수 있습니다. 그녀의 아래에 단지 두 개 노드가 있습니다. – Charles380

+0

재귀가있는 훌륭한 아이디어가 있습니다. – Emo

+0

완벽하게 작동합니다. 도움 Charles에 감사드립니다 ... – Emo

0

이 아마 주로 당신이 원하는, 당신은 또한 treeView라는 트 리뷰와 일부 XAML을해야 할 것입니다 : 윈폼를 들어

public TreeViewItem root; 

    public MainWindow() 
    { 
     InitializeComponent(); 

     root = new TreeViewItem 
     { 
      Header = "Customers" 
     }; 

     treeView.Items.Add(root); 

     addNode("John"); 
     addNode("Peter"); 
     addNode("Vanesa.New"); 
     addNode("Josh"); 
     addNode("Josh.New"); 
     addNode("Josh.New.Under"); 
    } 

    private void addNode(string values) 
    { 
     var n = root; 

     foreach (var val in values.Split('.')) 
     { 
      var isNew = true; 

      foreach (var existingNode in n.Items) 
      { 
       if (((TreeViewItem)existingNode).Header.ToString() == val) 
       { 
        n = (TreeViewItem)existingNode; 
        isNew = false; 
       } 
      } 

      if (isNew) 
      { 
       var newNode = new TreeViewItem 
       { 
        Header = val 
       }; 

       n.Items.Add(newNode); 

       n = newNode; 
      } 
     } 
    } 
0

동일한 문제가있었습니다. 결과는 당신이 원하는 무엇

string[] lis = {"a","b","a.a","a.ab","c","cc.a","a.b.dd","samad.hah.hoh"}; 
      treeView1.Nodes.Clear(); 
      TreeBuilder Troot = new TreeBuilder(); 
      TreeBuilder son; 
      Troot.depth = 0; 
      Troot.index = 0; 
      Troot.text = "root"; 
      Troot.childs = new Dictionary<string, TreeBuilder>(); 

      foreach (string str in lis) 
      { 
       string[] seperated = str.Split('.'); 
       son = Troot; 
       int index= 0; 
       for (int depth = 0; depth < seperated.Length; depth++) 
       { 
        if (son.childs.ContainsKey(seperated[depth])) 
        { 
         son = son.childs[seperated[depth]]; 
        } 
        else { 
         son.childs.Add(seperated[depth],new TreeBuilder()); 
         son = son.childs[seperated[depth]]; 
         son.index= ++index; 
         son.depth = depth+1; 
         son.text = seperated[depth]; 
         son.childs = new Dictionary<string, TreeBuilder>(); 
        } 
       } 
      } 
      treeView1.Nodes.Add("root"); 
      Troot.addToTreeVeiw(treeView1.Nodes[0], Troot); 

것 같아요 :

class TreeBuilder 
{ 
    public int index,depth; 
    public string text; 
    public Dictionary<string,TreeBuilder> childs; 
    public void addToTreeVeiw(System.Windows.Forms.TreeNode root, TreeBuilder tb) { 
     foreach (string key in tb.childs.Keys) { 
      System.Windows.Forms.TreeNode t = root.Nodes.Add(tb.childs[key].text); 
      addToTreeVeiw(t, tb.childs[key]); 

     } 
    } 
} 

및 주요 부분 : 나무를 구현하는 클래스를 정의

: 나는이 방법으로 그 해결

enter image description here