劉雄軍 寧云智
[摘 要]在上網時經常會看到一些網站在左邊采用類似資源管理器的樹形結構,單擊樹形結構中的分支,相應的內容將在右邊顯示,層次清晰且方便快捷,本文主要介紹TreeView控件在ASP.NET中的應用,旨在對想在網站上使用樹形結構的讀者提供幫助。
[關鍵詞]TreeView 數據庫連接 數據綁定 樹形控件 控件
一、概述
TreeView是一個重要的控件,無論是在VB.NET,C# 還是VB、Delphi等各種語言中,都充當了導航器的作用。在實際工作中,很多情況下需要將TreeView與數據庫進行連接,以填充其節點。在Windows Form和Web Form中,我們可以用TreeView來顯示樹形結構,如顯示目錄樹、顯示地區、分類顯示商品等。可以說,在大部分軟件的開發中,TreeView都是一個不可缺少的展示控件。因此,樹形結構的設計就成了軟件開發人員一個永恒的話題。
二、在Visual Studio .NET 2003中添加樹形控件
(一)安裝TreeView控件。從網上下載IEWebControls文件,并安裝,注意其安裝目錄的位置。
(二)更改“build.bat”文件的屬性。打開其安裝目錄,右擊“bulid.bat”文件,選擇“屬性”,打開“build.bat屬性”對話框,取消“只讀”屬性。
(三)查找“csc.exe”文件的路徑。“csc.exe”為系統文件,默認的路徑為“C:WINDOWSMicrosoft.NETFrameworkv1. 1.4322”。
(四)修改“build.bat”文件。右擊“bulid.bat”文件,選擇“編輯”,打開“build.bat”文件,如圖1如所。csc.exe的路徑與上一步查詢得到的路徑是否相同,若不相同則改之,修改之后保存文件。

(五)執行“build.bat”文件。雙擊“build.bat”文件,安裝目錄將生成一個“build”文件夾,此文件夾下的文件就是我們使用樹形控件時要用到的文件。
(六)復制文件到ASP.NET主目錄下。將“C:Program FilesIE Web Controls uild”下“runtime”文件夾下所有內容復制到主目錄“webctrl_client1_0”下,如果主目錄下沒有“webctrl_client 1_0”文件夾,則創建此路徑的文件夾。
(七)復制“Microsoft.Web.UI.Web Controls.dll”文件。將“C:Program FilesI E Web Controlsuild”下“Microsoft.Web. UI.WebControls.dll”文件復制到主目錄。
(八)將樹形控件添加到工具箱。打開Microsoft Visual Studio .NET,右擊工具箱,選擇“添加/移除項…”,打開“自定義工具箱”,單擊“瀏覽”按鈕,選擇“Microsoft.Web.UI.WebControls.dll”文件,單擊“確定”,TreeView控件將添加到工具箱中。
三、樹形控件在ASP.NET中的應用
TreeView控件中的數據來源有三種方式:界面設計時在TreeView設計器或者代碼中直接填充TreeView控件、從XML文件中建立樹形結構和從數據庫中得到數據,建立樹形結構。前兩種相對來說較簡單,這里就不介紹了,這里重點介紹從數據庫中得到數據。
一般來講,我們的應用程序多數是基于數據庫的。采用從數據庫中得到數據的這種方式,增加、修改、刪除一顆樹的節點很方便,只要操作數據庫中的數據就可以了。而且,這種方式可以和數據庫中的其它表做關聯、查詢和匯總,通過設計視圖或存儲過程,很容易查詢出你想要的相關數據。
(一)數據庫設計
我們在SQL SERVER 2000里建立一個表Tree_Tb,表的結構設計如下:

關于Depth(深度)字段,主要是存放節點的層數,也就是說這個節點在樹中的哪個層。有Depth(深度)字段,我們編程時會比較方便,在SQL查詢時只有加一個where條件就可以查詢出當前深度的層的所有節點。如果我們不設計Depth(深度)字段,同樣可以做類似的查詢,這就需要在后臺的SQL 查詢中用循環處理。或者,你可以不在后臺數據庫服務器端處理,把這些處理放在前臺。
建數據表的腳本如下:
CREATE TABLE [dbo].[Tree_Tb] ( [ID] [int] NOT NULL , [Context] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,[ParentID] [int] NULL ,[depth] [int] NULL ) ON [PRIMARY]
在表中添加數據,如下代碼所示:
insert Tree_Tb (ID,Context,ParentID,depth)values ( 1,'中國',0,0)
insert Tree_Tb (ID,Context,ParentID,depth)values ( 2,'北京',1,1)
insert Tree_Tb (ID,Context,ParentID,depth)values ( 3,'湖南省',1,1)
insert Tree_Tb (ID,Context,ParentID,depth)values ( 4,'河北省',1,1)
insert Tree_Tb (ID,Context,ParentID,depth)values ( 5,'廣東省',1,1)
insert Tree_Tb (ID,Context,ParentID,depth)values ( 6,'廣州',5,2)
insert Tree_Tb (ID,Context,ParentID,depth)values ( 7,'四川省',1,1)
insert Tree_Tb (ID,Context,ParentID,depth)values ( 8,'成都',7,2)
insert Tree_Tb (ID,Context,ParentID,depth)values ( 9,'長沙',3,2)
insert Tree_Tb (ID,Context,ParentID,depth)values ( 10,'石家莊',4,2)
insert Tree_Tb (ID,Context,ParentID,depth)values ( 11,'株洲',3,2)
insert Tree_Tb (ID,Context,ParentID,depth)values ( 12,'湘潭',3,2)
insert Tree_Tb (ID,Context,ParentID,depth)values ( 13,'上海',1,1)
數據內容如圖2所示。

(二)在ASP.NET中的實現
在ASP.NET中實現將數據庫數據綁定到樹形控件的思路是:從數據庫中查詢到所有節點的記錄,添加到DataView中,利用DataView的.RowFilter屬性得到某個父節點編號ParentID下的所有記錄,依次遞歸循環。程序代碼如下。
Private ds As New DataSet ()
' AddTree遞歸函數每次都要用到數據集中的一個表,所以定義成private
Private Sub Form1_Load
(ByVal sender As System.Object,
ByVal e As System.EventArgs) Handles MyBase.Load
' '定義數據庫連接
Dim CN As New SqlConnection()
Try
'初始化連接字符串
CN.ConnectionString = “server=.;database=pubs; user id=sa;Password=sa;” CN.Open()
'添加命令,從數據庫中得到數據
Dim sqlCmd As New SqlCommand()
sqlCmd.Connection = CN
sqlCmd.CommandText = "select * from Tree_Tb"
sqlCmd.CommandType = CommandType.Text
Dim adp As SqlDataAdapter = New SqlDataAdapter(sqlCmd)
adp.Fill(ds)
Catch ex As Exception
MsgBox(ex.Message)
Finally
'關閉連接
CN.Close()
End Try
'調用遞歸函數,完成樹形結構的生成
AddTree(0, Nothing)
End Sub
'遞歸添加樹的節點
Private Sub AddTree(ByVal ParentID As Integer, ByVal pNode As TreeNode)
Dim Node As TreeNode
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
If pNode Is Nothing Then'判斷是否根節點
'添加根節點
Node = TreeView1.Nodes.Add(Row("context").ToString())
'再次遞歸
AddTree(Int32.Parse(Row("ID").ToString()),Node)Else
‘添加當前節點的子節點
Node = pNode.Nodes.Add(Row("context").ToString())
'再次遞歸
AddTree(Int32.Parse(Row("ID").ToString()), Node)
End If
Node.EnsureVisible()
Next
End Sub
執行上面的程序就可以看到將數據庫的數據綁定到了樹形控件。
四、結束語
TreeView是一個重要的導航控件,希望本文的介紹能對想在網站上使用樹形結構的讀者有所幫助。
參考文獻
[1]Microsoft Visual Studio 。NET 2003文檔
[2]MSDN Library Visual Studio。NET
[3]黃志超,李婷婷Visual Basic。NET項目開發實踐
[4]楊帆,趙義霞。ASP.NET技術與應用
[5]Sanjew Rohilla,Senthil NathanADO.NET專業項目實例開發。陳君,王寶良譯,中國水利水電出版社,2003