Asp.net treeview实现无限级树实现代码

 更新时间:2009年09月17日 14:14:43   作者:  
最近研究了一下treeview,发现有两种实现无限级树的方法,文字不想多写,直入主题。

先看看效果图:

先看看数据库表的设计,数据表主要包括ID,Name,ParentID这三项,其中ID是主键,ParentID对应节点的父节点:


方法一:用递归遍历数据,并将节点逐个添加到treeview中去。
1.先进行数据库连接和数据的读取,并将根节点先添加进treeview中,并利用递归getTreeView()实现数据的遍历和添加:

复制代码 代码如下:

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
TreeNode nodeCategory ;
connection conn = new connection();
List<Category> category = conn.getCategory();
Stack<Category> storeCategory = new Stack<Category>();
storeCategory.Push(category[0]);
nodeCategory = new TreeNode(category[0].Name.Trim(), category[0].Id.Trim());
TreeView1.Nodes.Add(nodeCategory);
getTreeView(storeCategory, category, nodeCategory);
}
}

2.数据遍历的递归函数,比较简单就不多说了。
复制代码 代码如下:

public void getTreeView(Stack<Category> categoryStack,List<Category> categoryList,TreeNode e)
{
Category tmp;
if(categoryStack.Count>0)
{
tmp=categoryStack.Pop();
for(int i=0;i<categoryList.Count;i++)
if(categoryList[i].ParentId.Trim()==tmp.Id.Trim())
{
categoryStack.Push(categoryList[i]);
TreeNode childNote = new TreeNode(categoryList[i].Name.Trim(), categoryList[i].Id.Trim());
e.ChildNodes.Add(childNote);
getTreeView(categoryStack, categoryList, childNote);
}
}
}

方法二:用TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)事件响应来逐个读取子节点。
1.第一步基本和上一方法的第一步一致,只是要将节点的设置为不展开。
复制代码 代码如下:

protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
TreeNode nodeCategory ;
connection conn = new connection();
List<Category> category = conn.getCategory();
nodeCategory = new TreeNode(category[0].Name.Trim(), category[0].Id.Trim());
nodeCategory.PopulateOnDemand = true;
nodeCategory.Collapse();
nodeCategory.NavigateUrl = "http://blog.csdn.net/longlongago2000";
nodeCategory.Target = "_blank";
TreeView1.Nodes.Add(nodeCategory);
}
}

2.再改写TreeView1_TreeNodePopulate(),根据鼠标的点击得到该节点的ID,然后根据该ID进行数据的读取,将其下的子节点读出。
复制代码 代码如下:

protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e)
{
int categoryID = Int32.Parse(e.Node.Value);
connection conn = new connection();
List<Category> category = conn.getCategory();
foreach (Category tmp in category)
{
if (categoryID.ToString() == tmp.ParentId.Trim())
{
TreeNode childNote = new TreeNode(tmp.Name.Trim(), tmp.Id.Trim());
foreach (Category cate in category)
{
if (tmp.Id.Trim() == cate.ParentId.Trim())
{
childNote.PopulateOnDemand = true;
childNote.Collapse();
break;
}
else
childNote.Expand();
}
childNote.NavigateUrl ="http://blog.csdn.net/longlongago2000" ;
childNote.Target = "_blank";
e.Node.ChildNodes.Add(childNote);
}
}

以上两种方法都可以实现无限级分类,不过第一种方法显然更好一些,第二种方法不可以实现全部展开功能,而第一种可以。

相关文章

  • .NET NativeAOT 用法指南

    .NET NativeAOT 用法指南

    NativeAOT是.NET 8中引入的一种编译方式,它将代码编译成原生代码,提高性能并节省资源,然而,NativeAOT也带来了一些问题,如反射依赖、泛型实例化等,本文详细介绍了如何使用NativeAOT以及如何解决这些常见问题,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • 详解asp.net core封装layui组件示例分享

    详解asp.net core封装layui组件示例分享

    本篇文章主要介绍了详解asp.net core封装layui组件示例分享,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • C#/.NET读取或修改文件的创建时间及修改时间详解

    C#/.NET读取或修改文件的创建时间及修改时间详解

    这篇文章主要给大家介绍了关于C#/.NET读取或修改文件的创建时间及修改时间的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-08-08
  • Asp.net给站点某目录增加Aspnet用户

    Asp.net给站点某目录增加Aspnet用户

    Asp.net给站点某目录增加Aspnet用户...
    2006-09-09
  • .Net MinimalApis响应返回值的详细过程

    .Net MinimalApis响应返回值的详细过程

    本文主要讲 MinimalApis 中的使用自定义IResultModel和系统自带IResult做响应返回值,结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-03-03
  • asp.net Execl的添加,更新操作实现代码

    asp.net Execl的添加,更新操作实现代码

    asp.net Execl的添加、修改等实现代码。
    2009-02-02
  • asp.net关于Cookie跨域(域名)的问题

    asp.net关于Cookie跨域(域名)的问题

    Cookie是一个伟大的发明,它允许Web开发者保留他们的用户的登录状态。但是当你的站点有一个以上的域名时就会出现问题了。在Cookie规范上说,一个cookie只能用于一个域名,不能够发给其它的域名。因此,如果在浏览器中对一个域名设置了一个cookie,这个cookie对于其它的域名将无效。如果你想让你的用户从你的站点中的其中一个进行登录,同时也可以在其它域名上进行登录,这可真是一个大难题。
    2012-12-12
  • asp.net AutoCompleteExtender的一个简单例子代码

    asp.net AutoCompleteExtender的一个简单例子代码

    asp.net AutoCompleteExtender的一个简单例子代码
    2009-12-12
  • asp.net 关于==?:和if()else()条件判断等效例子

    asp.net 关于==?:和if()else()条件判断等效例子

    关于==?:和if()else() 等效例子
    2010-03-03
  • gridview行索引获取方法及实现代码

    gridview行索引获取方法及实现代码

    GridView行索引的获取有利于对GridView行数据进行操作(删、改)等等,接下来介绍获取方法,感兴趣的朋友可以了解下,阅读本文希望对你有帮助
    2013-01-01

最新评论