300x250 AD TOP

Friday, October 14, 2011

Tagged under:

Coverting TreeNodes into Lists C#

Extending C# Tree's

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;  
   }   

0 comments:

Post a Comment