2013-04-24 64 views
2

我有一個輸入流是這樣的:分隔符分隔字符串的TreeView C#

John 
Peter 
Vanesa 
Vanesa.New 
Josh 
Josh.New 
Josh.New.Under 
... 

我需要添加節點到TreeView的成才這樣的:

+Customers 
    +John 
    +Peter 
    +Vanesa 
     +New 
    +Josh 
     +New 
     +Under 
... 

我有一個想法分裂每個字符串的參數'。',但我有動態加載節點的問題。也許我必須使用某種foreach ...

我有舊的數據庫表「組」與記錄ID和組名。充滿了這些字符串。我需要創建一些「地址」,如:John.Element或Vanesa.New.Element或Josh.New.Under.Element,其中Element是來自其他數據表的記錄。數據庫連接是沒有問題的,問題是動態地填補了樹

現在我已經完成了添加字符串,不包含「」:

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。老,John.Older節點,但他們必須進入treenode約翰。如果你有一些想法...

+0

所以你有一個列表/數組/枚舉等字符串,需要添加節點到treev但是您想要添加子節點並且正在解決如何添加子節點的問題?我只是不確定確切的問題是什麼。 – Charles380 2013-04-24 13:36:32

+0

http://stackoverflow.com/questions/6280524/how-to-add-nodes-to-a-treeview-programatically也許你需要開始 – Charles380 2013-04-24 13:41:53

+0

也是這個WPF或winforms? – Charles380 2013-04-24 14:19:23

回答

1

對於的WinForms,這是你所需要的。我使用遞歸在每個父節點內添加每個子節點。我已經做了更改,以便在它開始向實際樹狀圖添加任何節點之前創建唯一節點列表。

  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

這可能會被修改爲不刪除節點,但重新使用它們,當它發現匹配說Vanessa有在她下面的兩個節點,而不是隻有1. – Charles380 2013-04-24 17:40:53

+0

遞歸的好主意我會試試看tomorow謝謝... – Emo 2013-04-24 19:33:48

+0

它完美的作品。謝謝你的幫助Charles ... – Emo 2013-04-25 08:27:00

0

這可能會做主要是你想要的,你還需要一些XAML與一個叫treeView的TreeView:

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

我遇到了同樣的問題。我解決了,以這種方式:

定義實現一樹一類:

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]); 

     } 
    } 
} 

與主要部分:

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

我猜的結果是你想要什麼:

enter image description here