2013-04-24 61 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