代码改变世界

【转】排序TreeView的节点

  山不转水转...  阅读(677)  评论(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;
    }

 

 

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示