woshishandawang

博客园 首页 新随笔 联系 订阅 管理

最近做了一点小东西 ,用到了递归在TreeView中加node  觉得很好用 写一点心得与大家分享
刚一说到递归 可能大家会很头疼,因为大家觉得他可能很神秘,不好弄.但是只要你明白了其中的原理,递归还是有它好用之处的,对于有规律的数据,递归可以帮你搞定.而不用自己在费脑子在哪写很多代码/
说了半天递归到底是怎么回事呢.其实大白话自己套用自己的循环.首先递归要有入口.没有入口的循环是无法进行的.其次你的循环要能出来.不要无限循环下去.
下面就已我做的treeView中加节点 的例子来说明递归的方法
这样大家就会有形象的认识了
先来看看我的数据库的设计


主要用到的是 前三个字段 
这里的代码我用的是强类型数据集  便于理解每个段的意思

 private void Init()
        {
            Xs_Areaset = new DALXs_Areaset();
           dsSelect = Xs_Areaset.FindDsXs_AreasetByCode("-1");//先找到一个最上面的节点,也就是给个入口
            //foreach (dsXs_Areaset.Xs_AreasetRow Row in dsSelect.Xs_Areaset.Rows)
            //{
            //    TreeNode node = new TreeNode(Row.AreaName.ToString());
            //    node.Tag = Row.AreaCode.ToString();
            //    trvAreare.Nodes.Add(node);
            //    ShowChildNode(node);
            //}//用了
两种 foreach  和for都行  推荐用foreach   两种发法的机制不一样  foreach安全 效率高
            for (int i = 0; i < dsSelect.Xs_Areaset.Rows.Count; i++)
            {
                TreeNode node = new TreeNode(dsSelect.Xs_Areaset.Rows[i][1].ToString());
                node.Tag = dsSelect.Xs_Areaset.Rows[i][0].ToString();
                trvAreare.Nodes.Add(node);
               
                ShowChildNode(node);
            }
            trvAreare.Nodes[0].Expand();//第一项展开
            trvAreare.SelectedNode = trvAreare.Nodes[0];//默认选中第一项
           }
        /// <summary>
        /// 显示子节点
        /// </summary>
        private void ShowChildNode(TreeNode node)//编写的递归的方法
        {
            //TreeNode node;
            //node = this.trvAreare.SelectedNode;
            //string ParentCode = trvAreare.SelectedNode.Tag.ToString();
            //dsSelectChile = new dsXs_Areaset();
            dsXs_Areaset dsSelectChile = new dsXs_Areaset();
            //using (Xs_Areaset=new DALXs_Areaset())//强制垃圾回收  可以不用  也可以不懂
            //{
            dsSelectChile = Xs_Areaset.FindDsXs_AreasetByCode(node.Tag.ToString());
            //}
            //foreach (dsXs_Areaset.Xs_AreasetRow Row in dsSelectChile.Xs_Areaset.Rows)
            //{
            //    TreeNode nd = new TreeNode(Row.AreaName.ToString());
            //    nd.Tag = Row.AreaCode.ToString();
            //    node.Nodes.Add(nd);
            //    ShowChildNode(nd);
            //}
            for (int i = 0; i < dsSelectChile.Xs_Areaset.Rows.Count; i++)//循环必须写对了  要能循环出来才行
            {
                dsXs_Areaset.Xs_AreasetRow Row = (dsXs_Areaset.Xs_AreasetRow)dsSelectChile.Xs_Areaset.Rows[i];
                TreeNode nd = new TreeNode(Row.AreaName.ToString());
                nd.Tag = Row.AreaCode.ToString();
                node.Nodes.Add(nd);
                ShowChildNode(nd);//自己套用自己  递归方法的体现
            }

        }

 

以上用了两种循环写的  都可以实现 ,但推荐 foreach   具体两种方法的机制有什么不一样 可以去网上看看

到此样式就结束了  是不是真正的代码没有多少  ,我这里的数据库是只有三级 的  哪怕你有十级  这个方法也自己给你搞定 不用你在费心了
顺便在说一下啊    所有的递归方法都可以用别的方法来替代  不是为了实现某些功能只能用递归的

 

 

posted on 2008-02-27 10:26  王永东  阅读(676)  评论(2编辑  收藏  举报