我的上篇文章《樹形結構在開發中的應用》主要是在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技術!