递归方法绑定多级动态目录

在编程中很可能使用到多级动态目录,如果使用一般的方法将多级目录绑定到Treeview就显得非常局促了,所以,最好的办法就是使用递归,使用递归就完全不用去考虑目录的层次有多深.
代码其实很简单.

 1   protected void Page_Load(object sender, EventArgs e)
 2     {
 3         string connstring = "Data Source=.;Initial Catalog=MyDB;Persist Security Info=True;User ID=sa;Password=******";
 4         SqlConnection con = new SqlConnection(connstring);
 5          SqlDataAdapter sda = new SqlDataAdapter( "select ID,ParentID,Name from Sys_Directory where isuse=1",con);
 6         DataSet ds = new DataSet();
 7         sda.Fill(ds);
 8         DataTable dt = ds.Tables[0];
 9         BindTree(dt,null,0);
10     }
11     private void BindTree(DataTable dt, TreeNode parentnode, int parentid)
12     {
13
14         DataRow[] rows = dt.Select(string.Format("ParentID={0}", parentid));
15         foreach (DataRow row in rows)
16         {
17             TreeNode node = new TreeNode();
18             node.Text = row["Name"].ToString();
19             node.Value = row["ID"].ToString();
20             BindTree(dt, node,Convert.ToInt32( row["ID"]));
21             if (parentnode == null)
22             {
23                 tv1.Nodes.Add(node);
24             }
25             else
26             {
27                 parentnode.ChildNodes.Add(node);
28             }
29         }
30
31     }

在递归方法中,传递一个我们从数据库中查询出来的datatable数据源,一个TreeNode,以及目录的父级ID.

下面这句话可能有些人不理解,dt.Select是系统的方法,按照主键顺序匹配每一条数据.这里的主键并非数据库中的主键,而是后面括弧中的指定的主键.

string.Format是格式化字符串

DataRow[] rows = dt.Select(string.Format("ParentID={0}", parentid));

后面的代码就是开始循环并递归了.

递归算法有这样第一特点,就是先循环遍历的终点,然后从终点开始递归计算.

在将目录绑定到treeview的时候进行一个判断,判断此节点是否为根节点.

但是,如果这个时候你在if处打上断点,然后F11,会发现,我们开始给parentnode复的null值,这时候判断却不是为空的,这是为什么呢?难道给Treenode赋null与parentnode=null不一样?还是递归算法不是循环到终点在从终点递归?其实不然.

if (parentnode == null)
            {
                tv1.Nodes.Add(node);
            }
            else
            {
                parentnode.ChildNodes.Add(node);
            }

我们回过去看if上面的代码,BindTree(dt, node,Convert.ToInt32( row["ID"]));

在调用自身方法的时候是需要传递一个parentnode参数的,而这个node已经在循环的时候已经赋值了,在开始递归的时候这个node的值不是开始的null值,而是你目录的最后一个子节点.

所以,递归开始从最后子节点开始的.最终递归到根节点.

时间: 2024-10-18 19:40:54

递归方法绑定多级动态目录的相关文章

在Asp.net core使用配置Json创建动态目录树

一.前言 使用动态目录树可以使左边栏中的目录更加灵活,本文介绍如何将目录保存在json配置文件中,再读取出来经过处理后生成目录树. 二.数据结构 1. TreeMenuNode类名 将TreeMenuNode类设置成与json格式相对应,注意Children应为List类型.目录的内容包括MenuName,Action,Controller,Icon public class TreeMenuNode2 { public int MenuNumber { get; set; } public s

MVC 多级目录(控制器) 路由重写 及 多级Views目录 的寻找视图的规则

转自:[原]Asp.net Mvc   多级控制器 路由重写 及 多级Views目录 的寻找视图的规则 asp.net mvc 为了更好的控制views的页面存放,和控制器的可读性,需要分开多级目录来存放. 1.那么我们再来看我们需要的访问方式,如下图 如果我们要访问Admin下的TestController里面的Index页面,那么我们输入Test/Index,这个肯定不行的.因为TestController根本就不在Controllers的根目录下,而是在Controllers/Admin下

DevExpress TreeList使用教程之绑定多级树

DevExpress TreeList使用教程之绑定多级树 概述:TreeList控件可以同时显示树结构和其他数据列,即在一个列上建立父子关系展开或收缩,同时还可以显示其他列的内容.在TreeList中同时引入了 Node和 Columns概念, 第一列为树结构, 其余列为数据列, 任何列都可作为树结构列(即拖动到第一列)显示 TreeList控件可以同时显示树结构和其他数据列,即在一个列上建立父子关系展开或收缩,同时还可以显示其他列的内容. 在TreeList中同时引入了 Node和 Colu

IIS 之 IIS 7及以上多域名或端口绑定同一物理目录并设置不同默认文档

今天在 IIS 7 多端口或域名绑定同一物理目录,设置不同的默认文档遇到问题:同一物理目录的多个站点修改任意一个站点默认文档都会一起更改. 原因:在同一个物理目录下只有一个 web.config,并且 IIS7 把默认文档设置写在这里,导致所有域名的默认文档设置共享. 解决方案: 比如我们把 www.ExampleA.com 和 www.ExampleB.com 两个域名都指向 E:\WebTest 文件目录,想把 www.ExampleA.com 的默认文档设为目录下的 indexA.html

DataGridView绑定DataTable动态生成列 并且将列名中文显示

方法一: DataGridView绑定获取到的DataTable数据,然后根据每一列手动设置列名,如图 方法二: 在写SQL查询语句的时候,直接在select后边的字段上 AS 想要显示的中文名称即可;如图

彻底解决wordpress主域名绑定到二级目录的问题

近日使用wordpress搭建个人博客,将wordpress目录整体上传到空间根目录下,安装完成后访问域名www.jjsir.com,访问失败.经过摸索设置,最终解决了该问题.方法如下: 1.登陆wordpress后台进行设置. wordpress地址:http://jjsir.com/wordpress网站程序放在根目录的wordpress文件夹下. wordpress站点地址:http://jjsir.com 如图示: 2.复制wordpress/index.php到根目录下.修改index

Mvc多级Views目录 asp.net mvc4 路由重写及 修改view 的寻找视图的规则

一般我们在mvc开发过程中,都会碰到这样的问题.页面总是写在Views文件夹下,而且还只能一个Controller的页面只能写在相应的以Controller名命名的文件夹下.如果我们写到别处呢?那么肯定会报错.这是mvc中一个约定俗成的一个规定,必须这样写. 1.正常的项目目录,如下图: 我们要访问Index页面,只需要输入Home/Index就可以访问了.我们之所以能够这样访问,是因为我们在项目创建之初系统就默认配置了一个默认的路由.我们可以按照这个默认的路由规则进行访问. 2.那么我们再来看

JQuery绑定事件处理动态添加的元素

情况概要: 要用全选按钮来全部选中查询出的结果. 在页面加载时,并没有数据项.需要点击查询后才能出来数据项. 一. 首先,我试了注册Click事件,肯定黄了. 二. 准备用live.然后发现现在的版本已经不支持. 三. 下载jquery 1.8,在加载时使用live方法. 1 //加载时执行的函数 2 $(RegisterEvent); 3 4 function RegisterEvent() { 5 $("#ChkAllItems").live("click",

实现Asp.Net Mvc4多级Views目录

建立自己MyViewEngine类让他继承RazorViewEngine,之后在构造函数里面写入设置视图位置格式代码如下: public class MyViewEngine : RazorViewEngine { public MyViewEngine() { ViewLocationFormats = new[] { "~/Views/{1}/{0}.cshtml", "~/Views/Shared/{0}.cshtml", "~/Views/User