李洪根关于树形文章里的概述:
"
概述:
TreeView是一个重要的控件,无论是在VB.NET,C# 还是VB、Delphi等各种语言中,都充当了导航器的作用。在实际工作中,很多情况下需要将TreeView与数据库进行连接,以填充其节点。在Windows Form和Web Form中,我们可以用TreeView来显示树形结构,如显示目录树、显示地区、分类显示商品等。可以说,在大部分软件的开发中,TreeView都是一个不可缺少的展示控件。因此,树形结构的设计就成了软件开发人员一个永恒的话题。
树形结构的展示方式
树形结构的展示一般来讲有三种方式:
1.界面设计时在TreeView设计器或者代码中直接填充TreeView控件。
2.从XML文件中建立树形结构。
3.从数据库中得到数据,建立树形结构。
第一种方式是最简单的,这种方式主要用于树形结构一般没有变化的应用程序,在设计时就固定一颗树。当然,在设计时固定了树的结构,以后要想修改、增加、删除树的节点,就必须修改源程序。所有不利于扩展。
第二种方式从XML文件中提取,由于XML本身就是树形结构的,微软提供的文档对象模型DOM 可以方便的读取、操作和修改 XML 文档。在.NET中,应用System.Xml类可以方便地将XML文件加载到TreeView控件中,微软的MSDN也提供了实例,此处就不再多说。
第三种方式,树形结构的数据,从数据库中获得。一般来讲,我们的应用程序多数是基于数据库的。采用这种方式,增加、修改、删除一颗树的节点很方便,只要操作数据库中的数据就可以了。而且,这种方式可以和数据库中的其它表做关联、查询和汇总,通过设计视图或存储过程,很容易查询出你想要的相关数据。下面,我们主要讨论这种方式的设计和实现。
"
下面贴上树形例子代码, 也是取自他的, 有一些小改动, 试过可以运行
数据库建一个表(新建查询):
CREATE TABLE [ dbo ] . [ tbTree ] (
[ ID ] [ int ] IDENTITY ( 1 , 1 ) NOT NULL ,
[ Context ] [ nvarchar ] ( 50 ) COLLATE Chinese_PRC_CI_AS NULL ,
[ ParentID ] [ int ] NULL
) ON [ PRIMARY ]
再建此表的脚本(新建查询):
SET IDENTITY_INSERT tbtree ON
insert tbtree (ID,Context,ParentID) values ( 1 , ' 中国 ' , 0 )
insert tbtree (ID,Context,ParentID) values ( 2 , ' 北京 ' , 11 )
insert tbtree (ID,Context,ParentID) values ( 3 , ' 天津 ' , 11 )
insert tbtree (ID,Context,ParentID) values ( 4 , ' 河北省 ' , 1 )
insert tbtree (ID,Context,ParentID) values ( 5 , ' 广东省 ' , 1 )
insert tbtree (ID,Context,ParentID) values ( 6 , ' 广州 ' , 5 )
insert tbtree (ID,Context,ParentID) values ( 7 , ' 四川省 ' , 1 )
insert tbtree (ID,Context,ParentID) values ( 8 , ' 成都 ' , 7 )
insert tbtree (ID,Context,ParentID) values ( 9 , ' 深圳 ' , 5 )
insert tbtree (ID,Context,ParentID) values ( 10 , ' 石家庄 ' , 4 )
insert tbtree (ID,Context,ParentID) values ( 11 , ' 辽宁省 ' , 1 )
insert tbtree (ID,Context,ParentID) values ( 12 , ' 大连 ' , 11 )
insert tbtree (ID,Context,ParentID) values ( 13 , ' 上海 ' , 1 )
insert tbtree (ID,Context,ParentID) values ( 14 , ' 天河软件园 ' , 6 )
insert tbtree (ID,Context,ParentID) values ( 15 , ' 汕头 ' , 5 )
SET IDENTITY_INSERT tbtree off
前台页面代码:WebForm1.aspx
<% @ Page Language = " C# " AutoEventWireup = " true " CodeBehind = " WebForm1.aspx.cs " Inherits = " WebApplication2.WebForm1 " %>
<! DOCTYPE html PUBLIC " -//W3C//DTD XHTML 1.0 Transitional//EN " " http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd " >
< html xmlns = " http://www.w3.org/1999/xhtml " >
< head runat = " server " >
< title > 无标题页 </ title >
</ head >
< body >
< form id = " form1 " runat = " server " >
< div >
< asp:TreeView ID = " TreeView1 " runat = " server " >
</ asp:TreeView >
</ div >
</ form >
</ body >
</ html >
后台页面代码:WebForm1.aspx.cs
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.SqlClient;
namespace WebApplication2
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load( object sender, EventArgs e)
{
// 定义数据库连接
SqlConnection CN = new SqlConnection();
try
{
// 初始化连接字符串
CN.ConnectionString =
" data source=.;initial catalog=Benchmark;user id=sa;Password=aaaaaa; " ;
CN.Open();
SqlDataAdapter adp = new SqlDataAdapter( " select * from tbTree " , CN);
DataSet ds = new DataSet();
adp.Fill(ds);
this .ViewState[ " ds " ] = ds;
}
catch (Exception)
{
// ̀跳转程序的公共错误处理页面
}
finally
{
CN.Close();
}
// 调用递归函数,完成树形结构的生成
AddTree( 0 , (TreeNode) null );
}
// 递归添加树的节点
public void AddTree( int ParentID, TreeNode pNode)
{
DataSet ds = (DataSet) this .ViewState[ " ds " ];
DataView dvTree = new DataView(ds.Tables[ 0 ]);
// 过滤ParentID,得到当前的所有子节点
dvTree.RowFilter = " [PARENTID] = " + ParentID;
foreach (DataRowView Row in dvTree)
{
TreeNode Node = new TreeNode();
if (pNode == null )
{ // 添加根节点
Node.Text = Row[ " ConText " ].ToString();
TreeView1.Nodes.Add(Node);
Node.Expanded = true ;
AddTree(Int32.Parse(Row[ " ID " ].ToString()), Node); // 再次递归
}
else
{ // ̀添加当前节点的子节点
Node.Text = Row[ " ConText " ].ToString();
pNode.ChildNodes.Add(Node);
Node.Expanded = true ;
AddTree(Int32.Parse(Row[ " ID " ].ToString()), Node); // 再次递归
}
}
}
}
}
再放一张图片方便理解:
asp.net里的树形结构我是今天第一次接触, 网上看了很多都看不懂, 还是做完这个例子后才理解一点, 分享快乐