2011-09-19 42 views
3

我有以下树:重新排序树形节点仅被填充后[0]

Animals 
| 
|___Zebra 
| |__Head 
| |__Arms 
| |__Legs 
| 
|___Monkey 
     |__Head 
     |__Arms 
     |__Legs 

每个动物具有存储在所述标签字段的ID号和它们的名称是在node.I的名称字段想要按下“按ID排序”并将上面的“Zebra”变成“14”等的按钮,然后按数字度假。但是,我希望孩子们留下头部,手臂和腿部秩序。当我使用下面的代码时,它可以工作,但它也会将头臂分为两臂,头部和腿部。我试过一个NodeSorter,但我没有得到任何不同的结果。我对C#也很新,所以我可能会错误地实现它。 :)我也用一个额外的字段来存储数据和布尔值的自定义节点。这就是“JacksNode”所指的下面。

下面的代码:

public static void sortByAnimalID(TreeView tv) 
    { 
     tv.BeginUpdate(); 
     foreach (TreeNode treeNode in tv.Nodes[0].Nodes) 
     { 
      if (((JacksNode)treeNode).IsAnimal) 
      { 
       treeNode.Text = Convert.ToString(treeNode.Tag); 
       treeNode.Name = Convert.ToString(treeNode.Tag); 
      } 
     } 
     tv.Sort(); 
     tv.EndUpdate(); 
    } 

什么我做错了任何想法?我在网上搜索了两周,并被所有的树视图文章淹没了。但是,没有一个是这个特定的。 谢谢你们有任何建议。

回答

6

使用TreeNode.Level属性找出如何比较节点属性。就像这样:

private void SortButton_Click(object sender, EventArgs e) { 
     if (treeView1.TreeViewNodeSorter == null) { 
      treeView1.TreeViewNodeSorter = new NodeSorter(); 
     } 
    } 
    private class NodeSorter : System.Collections.IComparer { 
     public int Compare(object x, object y) { 
      TreeNode node1 = (TreeNode)x; 
      TreeNode node2 = (TreeNode)y; 
      if (node1.Level == 1) { 
       return Convert.ToInt32(node1.Tag).CompareTo(Convert.ToInt32(node2.Tag)); 
      } 
      else { 
       return node1.Index.CompareTo(node2.Index); 
      } 
     } 
    } 
+0

我拿出convert.ToInt32(实际上我用的α-NUMS)和它转化为动物标识工作正常。但是,如果我在将名称换回后使用它,它不会再次排序。这很好,但。我可以使用基本的treeview.Sort()方法,它的工作正常。所以两个按钮,而不是一个。对于我正在做的事情来说,这不算什么大事。我之前曾尝试过这种解决方案,但我没有在最后使用else索引比较。我是一个新手!哈哈感谢汉斯,这看起来像会起作用。 –

-1
//bubble sort 
    public void Sort_TV_ByTag(TreeNodeCollection treeNodeCollection) 
    { 

     int i, j; 
     int n = treeNodeCollection.Count; 

     for (i = 0; i < n; i++) 
     { 
      for (j = 1; j < (n - i); j++) 
      { 
       int firstValue = int.Parse(treeNodeCollection[j - 1].Tag.ToString()); 
       int secondValue = int.Parse(treeNodeCollection[j].Tag.ToString()); 

       //you can compare by Tag , Text , anything 
       if (firstValue > secondValue) 
       { 

        //swap the nodes 
        TreeNode n1 = treeNodeCollection[j - 1]; 
        TreeNode n2 = treeNodeCollection[j]; 
        treeNodeCollection.Remove(n1); 
        treeNodeCollection.Remove(n2); 
        treeNodeCollection.Insert(j, n1); 
        treeNodeCollection.Insert(j - 1, n2); 

       } 

      } 
     } 

    } 


    private void button1_Click(object sender, EventArgs e) 
    { 
     Sort_TV_ByTag(treeView1.Nodes[0].Nodes); 
    }