.net平台下web树形结构程序设计
我的上篇文章《树形结构在开发中的应用》主要是在windows form下的实现,下面是web form下的实现。
数据库设计
首先,我们在sql server 2000里建立一个表tbtree,表的结构设计如下:
列名 数据类型 描述 长度 主键
id int 节点编号 4 是
parentid int 父节点编号 4
context nvarchar 我们要显示的节点内容 50
在sql server 2000中建表的脚本:
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,北京,1)
insert tbtree (id,context,parentid) values ( 3,天津,1)
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
下载treeview控件地址
http://msdn.microsoft.com/downloads/samples/internet/asp_dot_net_servercontrols/webcontrols/default.asp
安装后,通过“自定义工具箱”->“.net框架组件”把treeview添加到工具箱里。
新建一个项目,选择visual basic.net 工程asp.net web应用程序,在页面上拖画一个treeview控件。
html页:
<%@ register tagprefix="iewc" namespace="microsoft.web.ui.webcontrols" assembly="microsoft.web.ui.webcontrols, version=1.0.2.226, culture=neutral, publickeytoken=31bf3856ad364e35" %>
<%@ page language="vb" autoeventwireup="false" codebehind="webform1.aspx.vb" inherits="tree.webform1"%>
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<head>
<title>webform1</title>
<meta name="generator" content="microsoft visual studio .net 7.0">
<meta name="code_language" content="visual basic 7.0">
<meta name="vs_defaultclientscript" content="javascript">
<meta name="vs_targetschema" content="http://schemas.microsoft.com/intellisense/ie5">
</head>
<body ms_positioning="gridlayout">
<form id="form1" method="post" runat="server">
<font face="宋体">
<iewc:treeview id="treeview1" style="z-index: 101; left: 39px; top: 68px" runat="server"></iewc:treeview></font>
</form>
</body>
</html>
后台代码:
private sub page_load(byval sender as system.object, byval e as system.eventargs) handles mybase.load
dim ds as new dataset()
dim cn as new sqlconnection()
try
初始化连接字符串
cn.connectionstring = "data source=pmserver;initial catalog=benchmark;persist security info=false;user id=sa;password=sa;"
cn.open()
dim adp as sqldataadapter = new sqldataadapter("select * from tbtree", cn)
adp.fill(ds)
me.viewstate("ds") = ds
catch ex as exception
#if debug then
session("error") = ex.tostring()
response.redirect("error.aspx") ̀跳转程序的公共错误处理页面
#end if
finally
关闭连接
cn.close()
end try
调用递归函数,完成树形结构的生成
addtree(0, nothing)
end sub
递归添加树的节点
private sub addtree(byval parentid as integer, byval pnode as treenode)
dim ds as dataset
ds = me.viewstate("ds")
dim dvtree as new dataview()
dvtree = new dataview(ds.tables(0))
过滤parentid,得到当前的所有子节点
dvtree.rowfilter = "parentid = " + parentid.tostring
dim row as datarowview
for each row in dvtree
dim node as new treenode()
if pnode is nothing then 判断是否根节点
添加根节点
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.nodes.add(node)
node.expanded = true
再次递归
addtree(int32.parse(row("id").tostring()), node)
end if
next
end sub
c#版本:
using system;
using system.collections;
using system.componentmodel;
using system.data;
using system.drawing;
using system.web;
using system.web.sessionstate;
using system.web.ui;
using system.web.ui.webcontrols;
using system.web.ui.htmlcontrols;
using microsoft.web.ui.webcontrols;
using system.data.sqlclient;
namespace treecs
{
/// <summary>
/// webform1 的摘要说明
/// </summary>
public class webform1 : system.web.ui.page
{
protected microsoft.web.ui.webcontrols.treeview treeview1;
private void page_load(object sender, system.eventargs e)
{
// 定义数据库连接
sqlconnection cn = new sqlconnection();
try
{
//初始化连接字符串
cn.connectionstring= "data source=pmserver;initial catalog=benchmark;persist security info=false;user id=sa;password=sa;";
cn.open();
sqldataadapter adp = new sqldataadapter("select * from tbtree",cn);
dataset ds=new dataset();
adp.fill(ds);
this.viewstate["ds"]=ds;
}
catch (exception ex)
{
session["error"] = ex.tostring();
response.redirect("error.aspx"); //̀跳转程序的公共错误处理页面
}
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.nodes.add(node);
node.expanded = true;
addtree(int32.parse(row["id"].tostring()),node); //再次递归
}
}
}
#region web form designer generated code
override protected void oninit(eventargs e)
{
//
// codegen该调用是 asp.net web 窗体设计器所必需的。
//
initializecomponent();
base.oninit(e);
}
/// <summary>
///设计器支持所需的方法 – 不要使用代码编辑器修改
/// 此方法的内容
/// </summary>
private void initializecomponent()
{
this.load += new system.eventhandler(this.page_load);
}
#endregion
}
}
后记:请读者自行修改程序中的连接字符串设置。
声明:本文版权与解释权归李洪根所有,如需转载,请保留完整的内容及此声明。
qq: 21177563
msn: lihonggen@hotmail.com
专栏:http://www.csdn.net/develop/author/netauthor/lihonggen0/