摘要:該文基于在線交互教務管理系統的開發經驗,利用ASP.NET提供的TreeView控件,結合SQL Server數據庫表,采用深度遞歸遍歷算法實現了動態導航樹,并對算法進行了性能分析。
關鍵詞:TreeView;數據庫表;遞歸算法; 動態導航樹
中圖分類號 TP311文獻標識碼:A 文章編號:1009-3044(2008)28-0146-03
Achievement of Dynamic Navigation Tree Based on ASP.NET
YAO Dun-hong1,2,CHEN Shu-yu1,JIANG Qi-ming2
(1.School of Software Engineering, ChongQing University, ChongQing 400030, China;2.Department of Computer Science and Technology of Huaihua University, Hunnan 418008, China)
Abstract: This paper on the basis of the development experience of \" Interactive Online Educational Management System \", using TreeView control provide by ASP.NET, combine SQL Server database table, adopt the depth spreading recursion algorithm has been realized dynamic navigating tree, and has carried on the analysis of performance to the algorithm.
Key words: treeView; database table;algorithm; dynamical navigation tree
1 引言
在使用ASP.NET開發基于WEB的應用系統時,用戶經常希望用樹狀結構來顯示分類或層次數據,比如網站的樹形導航、管理分類導航等。使用這樣的動態顯示技術既簡單又直觀,而且方便用戶訪問。ASP.NET提供的TreeView服務器控件[1]就是以分層的方式向用戶提供信息的,適用分層的數據集、文件夾視圖以及其它類似的數據結構,可以生成用于顯示分層數據的用戶界面。
如何在ASP.NET下實現動態樹型結構的生成,是一直以來的討論話題,筆者結合實際開發經驗,現將利用ASP.NET服務器控件TreeView結合SQL Server2000數據庫設計動態樹型結構的設計與實現總結如下。
2 動態導航樹數據表及訪問技術
與動態樹相對應的樹稱之為靜態樹,靜態樹的生成雖然比較簡單,不需要編寫太多代碼,但其后續維護工作比較復雜。在實際開發過程中,更好的方法是結合數據庫生成動態樹,實現動態綁定顯示節點及增刪節點。
2.1 數據庫表結構設計
表1是筆者在開發在線交互教務管理系統中所設計的導航數據庫表。表中的每一個元組都包含樹中一個節點的信息: 主關鍵字NodeID是結點在樹中的唯一標識; ParentID存放該節點上級節點的NodeID,其中根結點的ParentD設為0;NodeName用于節點名稱,在實際應用中可用于存放希望顯示在網頁上的結點信息;NodeURL存放節點鏈接地址;Pic為顯示在每個節點前的圖形文件地址。
2.2 TreeView控件與數據庫的連接
數據庫表建好后就可在VS2005中創建樹形結構頁面tree.aspx,并從工具框中拖放一個樹形控件,然后的工作就是對其節點數據的添加和綁定及控件事件、效果的添加和設定。
考慮到系統代碼的可重用性[3],按照三層結構進行創建,所以數據層單獨列出并作為一個類[4]進行創建。如DBclass.cs類,其類圖如圖1所示。
其中GetConnection()方法的定義如下:
public static SqlConnection GetConnection()
{ //獲取數據連接語句,并創建數據庫連接對象
String conn = ConfigurationManager.AppSettings[\"sqlconn\"].ToString();
SqlConnection myConn;
myConn = new SqlConnection(conn);
return myConn;
}
另外GetUrl()是根據NodeID標識號取得節點對應URL的方法也在此一并定義。
2.3 數據庫訪問技術
ASP.NET中對數據庫的訪問是通過ADO.NET(動態數據對象)上的ManagedProvide所提供的API來實現的,包括OLEBD和ODBC所支持的數據庫[2]。SqlDataAdapter是DataSet和SQL Server之間的橋接器,用于檢索和保存數據。SqlDataAdapter通過對數據源使用適當的Transact-SQL語句映射Fill(它可更改DataSet中的數據以匹配數據源中的數據)和Update(它可更改數據源中的數據以匹配DataSet中的數據)來提供這一橋接。
首先我們建立Tree類并在類中作如下的定義:
protected SqlConnection myConn;
protected SqlDataAdapter myAdapter;
protected DataSet data;
protected string query;
然后在Tree類中定義一個CreateDataSet方法來建立與數據庫的訪問:
public DataSet CreateDataSet()
{
query = \"select * from sysfuncrights\";
myAdapter = new SqlDataAdapter(query, myConn);
data = new DataSet();
myAdapter.Fill(data, \"query\");
return data;
}
3 深度遍歷遞歸算法
3.1 導航目錄樹的深度遍歷思想
從sysfuncrights數據庫表結構我們可以看出,該表中有一個稱為根的結點,根結點下可以有多個子結點(即一級樹目錄),而每個一級結點下又可有若干個子結點(二級樹目錄),子結點下又可有子結點(三級樹目錄)…,這樣我們可以把sysfuncrights表中記錄之間的關系理解為一個無環路的非連通圖G。
假設給定圖G的初態是所有頂點均未曾訪問過。在G先選根結點v為初始出發點(源點),則深度優先遍歷可定義如下:首先訪問出發點v,并將其標記為已訪問過;然后依次從v出發搜索v的每個鄰接點w。若w未曾訪問過,則以w為新的出發點繼續進行深度優先遍歷,直至圖中所有和源點v有路徑相通的頂點(亦稱為從源點可達的頂點)均已被訪問為止。若此時圖中仍有未訪問的頂點,則另選一個尚未訪問的頂點作為新的源點重復上述過程,直至圖中所有頂點均已被訪問為止[5]。
3.2 深度遍歷遞歸算法的實現
以下是在Tree類中利用深度遍歷遞歸算法定義InitTree方法創建導航目錄樹,其參數可從上面所獲得的data數據集。
//從DataSet中取數據建樹
//從根節點開始遞歸調用顯示子樹
public void InitTree(TreeNodeCollection Nds, string parentId)
{
TreeNode NewNode;
//data為存儲建樹數據信息的數據集
//用父節點進行篩選數據集中信息
DataRow[] rows = data.Tables[0].Select(\"parentId='\" + parentId + \"'\");
foreach (DataRow row in rows)//遍歷當前的所有子節點
{
NewNode = newTreeNode(row[\"NodeName\"].ToString(), row[\"NodeId\"].ToString(), row[\"NodeURL\"].ToString());
NewNode.NavigateUrl = row[\"NodeURL\"].ToString();//取得節點導航路徑
NewNode.ImageUrl = row[\"pic\"].ToString();//取得節點所對應的圖形路徑
Nds.Add(NewNode);//將節點添加到TreeView的節點集合中
InitTree(NewNode.ChildNodes, row[\"NodeId\"].ToString());//遞歸調用
TreeView1.Target = \"wdcontent\";
}
}
4 結果分析
我們知道,對于圖的深度優先算法的時間復雜度為O(n2)[6],這就取決于n規模的大小,如果在開發的應用系統中導航目錄樹節點n不太大的情況下,其效果是不錯的。筆者利用這種算法思想開發在線交互教務管理系統得到的導航目錄樹基本滿足了問題需求,運行結果理想,如圖2所示。
5 結論
通過介紹建立動態導航樹的數據表、存儲到DataSet對象中,并以所獲得的data作為參數使用遞歸算法生成導航樹,闡述了在ASP.NET中使用TreeView控件和數據庫技術創建動態導航樹的具體實現方法和步驟。這種依賴于數據庫生成的導航樹隨著數據源的改變樹結構隨之轉換,避免了靜態導航樹下數據源經常性改變而不得不頻繁修改程序代碼帶來的麻煩,使得在網頁上實現導航樹和在窗體程序中一樣方便。
參考文獻:
[1] 施燕妹,陳培,陳發吉,等. C#語言程序設計教程[M].北京:中國水利水電出版社,2004.
[2] [美]KLAUS MICHELSEN,c# PRIMER PLUS(中文版)[M].北京:人民郵電出版社,2002.
[3] 肖漢.基于可重用構件的軟件開發模式研究[J].微電子學與計算機,2007(1):178-181.
[4] [美]Wendy B,Michael B.UML與Rational Rose 2002從入門到精通[M].北京:電子工業出版社,2002.
[5] 嚴蔚敏,吳偉民.數據結構[M].北京:清華大學出版社,2002.
[6] 鄧芳.關于遞歸算法時間復雜度分析的探討[J].浙江萬里學院學報,2005(4):24-27.