首页 > 编程 > .NET > 正文

.NET平台下Web树形结构程序设计

2024-07-10 13:02:37
字体:
来源:转载
供稿:网友
我的上篇文章《树形结构在开发中的应用》主要是在windows form下的实现,下面讲一下web form下的实现。

概述

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也提供了实例,此处就不再多说。
第三种方式,树形结构的数据,从数据库中获得。一般来讲,我们的应用程序多数是基于数据库的。采用这种方式,增加、修改、删除一颗树的节点很方便,只要操作数据库中的数据就可以了。而且,这种方式可以和数据库中的其它表做关联、查询和汇总,通过设计视图或存储过程,很容易查询出你想要的相关数据。下面,我们主要讨论这种方式的设计和实现。

数据库设计

首先,我们在sql server 2000里建立一个表tbtree,表的结构设计如下:
列名数据类型描述长度主键
idint节点编号4是
parentidint父节点编号4
contextnvarchar我们要显示的节点内容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,'北京',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


下载地址
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
{
///
/// webform1 的摘要说明
///
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
}
}

后记:请读者自行修改程序中的连接字符串设置。
附:相关微软msdn文档,包括在vb6和.net中从xml建立树形结构
http://support.microsoft.com/default.aspx?kbid=311318
http://support.microsoft.com/default.aspx?kbid=308063
http://support.microsoft.com/default.aspx?kbid=317597
http://support.microsoft.com/default.aspx?kbid=244954
  • 网站运营seo文章大全
  • 提供全面的站长运营经验及seo技术!
  • 发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表