private static void PopulateTreeNodesRecursive(TreeNode node,
                                                       SPSNodeCollection dataChildrens,
                                                       TreeBound delegateBound)
        {
            foreach (SPSNodeBase subDataNode in dataChildrens)
            {
                TreeNode newNode = new TreeNode(subDataNode.Name,
                                                subDataNode.UrlSegment,
                                                subDataNode.ImageUrl,
                                                subDataNode.NavigateUrl,
                                                "");

                node.ChildNodes.Add(newNode);

                Debug.WriteLine(string.Format("-> {0},{1},{2},{3}",
                                              subDataNode.Name,
                                              subDataNode.UrlSegment,
                                              subDataNode.ImageUrl,
                                              subDataNode.NavigateUrl));

                if (delegateBound != null)
                {
                    delegateBound(newNode, subDataNode);
                }

                PopulateTreeNodesRecursive(newNode, subDataNode.Children, delegateBound);
                subDataNode.Dispose();
            }
        }
        private static TreeNode PopulateTreeNodes(SPSHierarchyDataSource dataSource, TreeBound delegateBound)
        {
            TreeNode root;

            using (SPSNodeCollection dataNodes = dataSource.GetAll())
            {
                SPSNodeBase dataRoot = dataNodes[0];
                root = new TreeNode(dataRoot.Name, dataRoot.UrlSegment, dataRoot.ImageUrl, dataRoot.NavigateUrl, "");

                if (delegateBound != null)
                {
                    delegateBound(root, dataRoot);
                }

                PopulateTreeNodesRecursive(root, dataRoot.Children, delegateBound);
            }
            return(root);
        }