先来看看效果,基本上就是这样的。

所谓树,无非就是2点,第一个:根节点,第二:叶子节点,其中叶子节点中还可能有叶子节点,但是根节点始终只有一个。

下面贴上 各部分的代码

1.PAGE_LOAD载入事件。

    protected void Page_Load(object sender, EventArgs e)
{
BindTree(); //绑定树
}

2.BindTree方法。

    private void BindTree()
{
DataSet ds = new DataSet(); //这里的DS里不存在数据,具体情况请大家自己具体考虑,修改代码 TreeView1.Nodes.Clear(); AddTree("-1", (TreeNode)null,ds);
TreeView1.Nodes[0].Expanded = true;
}

3.AddTree方法,递归添加树。

/*其中ds对应的是一个实体类Model,里面的IndexName,IndexID等,都是对应着数据库里的相应字段所以我们在使用这个方法时前,必须先得到相对应的有具体意义的DataSet*/

 /// <summary>
/// 递归树
/// </summary>
/// <param name="ParentID">当前节点父节点ID</param>
/// <param name="pNode"></param>
/// <param name="ds"></param>
private void AddTree(string ParentID, TreeNode pNode,DataSet ds)
{
DataView dvTree = new DataView(ds.Tables[0]); //用DataView来模拟DataTable,因为DV是虚拟的表,所以可以提高效率
foreach (DataRowView Row in dvTree)
{
TreeNode node = new TreeNode();
if (pNode == null)
{ //添加根节点
node.Text = Row["IndexName"].ToString();
node.Value = Row["IndexID"].ToString(); if (Row["IndexClass"].ToString() == "0")
{
node.NavigateUrl = "IndexInfo1.aspx?IndexID=" + node.Value;
}
else
{
node.NavigateUrl = "IndexInfo2.aspx?IndexID=" + node.Value;
} node.Target = "mainFrame";
node.Expanded = false;
TreeView1.Nodes.Add(node); //添加根节点
AddTree(Row["IndexID"].ToString(), node,ds); //递归,添加子节点,这段递归是必须的,不然只会添加根节点,而进不到下面的else语句,pNode在TreeView第二次执行以后都是不为空的,所以会一直跳到执行ELSE语句里的内容。 }
else
{ //添加当前节点的子节点 node.Text = Row["IndexName"].ToString();
node.Value = Row["IndexID"].ToString();
node.ToolTip = node.Text;
if (Row["IndexClass"].ToString() == "0" || Row["IndexParentID"].ToString() == "-1")
{ node.NavigateUrl = "IndexInfo1.aspx?IndexID=" + node.Value;
}
else
{ node.NavigateUrl = "IndexInfo2.aspx?IndexID=" + node.Value;
} node.Target = "Frame1"; //某一个节点指向的一个IFRAME,里面可以是这个节点下的具体内容。
//node.NavigateUrl = Request.Url.LocalPath + "?OrgID=" + Row["OrgID"].ToString();
node.Expanded = false;
pNode.ChildNodes.Add(node); //pNode为父节点,把Node作为子节点添加进去
AddTree(Row["IndexID"].ToString(), node,ds); //递归添加子节点
} } }

  

 

ASP.NET通过递归添加树(Treeview)的更多相关文章

  1. ASP.NET递归添加树节点

    表设计如图: id        title         parentid 1         asp.net   0 2         c#           0 3         c#_ ...

  2. Xml学习笔记(3)利用递归解析Xml文档添加到TreeView中

    利用递归解析Xml文档添加到TreeView中 private void Form1_Load(object sender, EventArgs e) { XmlDocument doc = new ...

  3. 菜鸟笔记:node.js+mysql中将JSON数据构建为树(递归制作树状菜单数据接口)

    初学Web端开发,今天是第一次将所学做随笔记录,肯定存在多处欠妥,望大家海涵:若有不足,望大家批评指正. 进实验室后分配到的第一个项目,需要制作一个不确定层级树形菜单的数据接口,对于从来没实战编过程的 ...

  4. ASP.NET MVC 5 - 添加一个模型

    在本节中,您将添加一些类,这些类用于管理数据库中的电影.这些类是ASP.NET MVC 应用程序中的"模型(Model)". 您将使用.NET Framework 数据访问技术En ...

  5. [Asp.net MVC]Asp.net MVC5系列——添加模型

    目录 概述 添加模型 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5系列——添加视图 概述 在本节中我们将追加 ...

  6. [Asp.net MVC]Asp.net MVC5系列——添加数据

    目录 概述 显示添加数据时所用表单 处理HTTP-POST 总结 系列文章 [Asp.net MVC]Asp.net MVC5系列——第一个项目 [Asp.net MVC]Asp.net MVC5系列 ...

  7. 05-XML遍历递归显示到TreeView上(XDocument类)

    1.XML文件(x1.xml): <?xml version="1.0" encoding="utf-8" ?> <itcast> &l ...

  8. 返璞归真 asp.net mvc (1) - 添加、查询、更新和删除的 Demo

    原文:返璞归真 asp.net mvc (1) - 添加.查询.更新和删除的 Demo [索引页] [源码下载] 返璞归真 asp.net mvc (1) - 添加.查询.更新和删除的 Demo 作者 ...

  9. ASP.NET网页动态添加、更新或删除数据行

    ASP.NET网页动态添加.更新或删除数据行 看过此篇<ASP.NET网页动态添加数据行> http://www.cnblogs.com/insus/p/3247935.html的网友,也 ...

随机推荐

  1. 为什么commonjs不适合于浏览器端

    有了服务器端模块以后,很自然地,大家就想要客户端模块.而且最好两者能够兼容,一个模块不用修改,在服务器和浏览器都可以运行. 但是,由于一个重大的局限,使得CommonJS规范不适用于浏览器环境.还是上 ...

  2. 通过修改i8042prt端口驱动中类驱动Kbdclass的回调函数地址,达到过滤键盘操作的例子

    同样也是寒江独钓的例子,但只给了思路,现贴出实现代码 原理是通过改变端口驱动中本该调用类驱动回调函数的地方下手 //替换分发函数 来实现过滤 #include <wdm.h> #inclu ...

  3. activity与fragment之间传递数据

    总结:无论是activity给fragment传递数据,还是fragment给activity传递数据,都把activity和fragment都当做一个普通的对象,调用它的方法,传递参数. 1.Fra ...

  4. JS中如何输出空格

    JS中如何输出空格 在写JS代码的时候,大家可以会发现这样现象: document.write("   1      2                3  "); 结果: 1 2 ...

  5. ex3-数字和数字计算

    代码: print("I will now count my chickens:") print("hens", 25+30/6)print("Roo ...

  6. 基于 Asp.Net的 Comet 技术解析

    Comet技术原理 来自维基百科:Comet是一种用于web的技术,能使服务器能实时地将更新的信息传送到客户端,而无须客户端发出请求,目前有两种实现方式,长轮询和iframe流. 简单的说是一种基于现 ...

  7. [Voice communications] 看得到的音频流

    上文介绍了 Web Audio API 的相关知识,以及如何在你的 web 程序中引入 音频流,内容都是介绍性的,所以没有写太多 DEMO.本文重点讲解如何利用 Web Audio API 中的中间节 ...

  8. npm不是以管理身份运行遇到的问题

    环境:win10+npm3.10.5 问题:在npm install lodash时,出现下列错误("npm-debug.log"文件内容) 0 info it worked if ...

  9. xamarin UWP中MessageDialog与ContentDialog的区别

    MessageDialog与ContentDialog的异同点解析: 相同点一:都是uwp应用上的一个弹窗控件.都能做为弹出应用. 相异点一:所在命名空间不同,MessageDialog在Window ...

  10. Atitit webservice的发现机制 discover机制

    Atitit webservice的发现机制 discover机制 1.1. Ws disconvert 的组播地址和端口就是37021 1.2. Ws disconvert的发现机制建立在udp组播 ...