仅在填充后重新排序树视图节点[0]

时间:2011-09-19 15:17:05

标签: c# winforms sorting treeview

我有以下树:

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

每只动物都有一个存储在标记字段中的ID号,它们的名称位于节点的名称字段中。我想按一个按“按ID排序”的按钮,上面的“斑马”变成“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();
    }

关于我做错的任何想法?我在网上搜索了两个星期,并且对所有的treeview文章都感到不知所措。但是,没有一个是具体的。 谢谢你们/ gals的任何建议。

2 个答案:

答案 0 :(得分: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);
            }
        }
    }

答案 1 :(得分:-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);
    }