代码改变世界

【转】排序TreeView的节点

2009-09-02 15:49  山不转水转...  阅读(666)  评论(0编辑  收藏  举报
http://blog.mdk-photo.com/post/C-Extentionmethod-Tree-Node-View-Sort%28%29.aspx

Extending C# Tree's

Sunday, 17 August 2008 22:54 by MartinKirk

Lets say you have a TreeView or a random TreeNode, that you want to present in sorted state. 

to make it REALLY easy, we just want to call a single method on either object .Sort() -

 

    TreeView mytree = new TreeView();
    //add nodes
    mytree.Sort();

 

 

this require that we extend each object like this:

 

    public static void Sort(this TreeView tv)
    {
        TreeNodeCollection T = tv.Nodes.Sort();
        tv.Nodes.Clear();
        tv.Nodes.AddRange(T);
    }

    public static void Sort(this TreeNode tn)
    {
        TreeNodeCollection T = tn.ChildNodes.Sort();
        tn.ChildNodes.Clear();
        tn.ChildNodes.AddRange(T);
    }

 

 

The sorting algorithm itself is ofcause a recursive descent through the nodes:

 

    public static TreeNodeCollection Sort(this TreeNodeCollection tnc)
    {
        TreeNodeCollection T = new TreeNodeCollection();

        while (tnc.Count > 0)
        {
            string comp = "";
            TreeNode tmp = new TreeNode() ;

            foreach (TreeNode node in tnc)
            {
                if (node.Text.CompareTo(comp) > 0)
                {
                    tmp = node;
                    comp = node.Text;
                }
            }
            T.AddAt(0,tmp);
            tnc.Remove(tmp);
        }

        foreach (TreeNode sub in T)
        {
            sub.Sort();
        }

        return T;
    }

 

 

The AddRange method i use, is also an extension, since these type of collections dont have such neat feature like Generics' collections

 

    public static void AddRange(this TreeNodeCollection TNC, TreeNodeCollection Col)
    {
        foreach (TreeNode node in Col)
        {
            TNC.Add(node);
        }
    }

 

 

Sorting has never been easier...

Now lets look at another missing method on Trees/Nodes : Descendants - known from XPath, a method which returns all nodes descendant to the current node:

 

    public static List<TreeNode> Descendants(this TreeNode node)
    {
        List<TreeNode> list = new List<TreeNode>();
        list.Add(Recurse(node, list));

        return list;
    }

    private static TreeNode Recurse(TreeNode node, List<TreeNode> list)
    {
        foreach (TreeNode sub in node.ChildNodes)
        {
            list.Add(Recurse(sub, list));
        }
        return node;
    }