摘 要 本文介紹一種基於web方式BS應用模式下,使用C#.net編程工具實現oracle資料庫記錄自動產生TreeView樹型結構的程式設計。
關鍵詞 c# ;動態;樹型;程式設計
許多應用軟體的程式設計,我們都希望能像Windows資源管理員那樣將其磁碟機和其下的檔案及檔案夾按照階層來安排。在C/S條件下這些很容易實現,那麼在B/S的Web方式下,我們實現起來就不是特別容易。針對這個問題,在 2002 年,Microsoft? 發布了四種 ASP.NET Web 控制項,用於為使用 Microsoft Internet Explorer 的 Web 存取者提供更好的體驗。這些 Web 控制項稱為 Internet Explorer Web 控制項,也簡稱為 IE Web 控制項,其中就包含了TreeView Web 控制項 ,它就為我們提供了一種按階層顯示資訊的方式。TreeView控制項包含了稱做“節點”(node)的一些條目的一個列表。每一個節點都可以有自己的節點集合,從而提供了一種更深層的資料定義。每個節點都可以被摺疊起來,從而允許訪問者在一個TreeView控制項中尋找,只看他所感興趣的那一級的資料。就像Windows的資源管理員一樣。只不過在使用前要安裝IE Web Controls,並配置好運行環境後才能使用,使用Visual Studio .NET,則靜態指定 TreeView 結構就像填寫幾份表格一樣簡單。
雖然使用 Visual Studio .NET 將靜態 TreeNote 添加到 TreeView 的過程非常簡單,但通常需要將內容動態地添加到 TreeView 中。例如,您將分類樹資訊儲存到了資料庫中,或是正在設計一個資源管理員風格的 Web 應用程式(在此應用程式中,使用者可以瀏覽 Web 服務器的檔案系統),這時您可能需要根據伺服器的檔案夾和檔案來動態填充 TreeNote。本文就是使用C#.net語言通過編程方式,配合Oracle資料庫實現一種動態效果,達到動態將TreeNote 添加到 TreeView 的目的。
1、 設計思路和方法
該程式設計思路和方法是:通過編程方式將TreeNote 添加到 TreeView 中。要將新的 TreeNote 添加到現有的 TreeNote 中,只需要使用 Nodes 屬性的 Add() 方法。方法是使用 C# 代碼將建立兩個 TreeNote,並將第二個 TreeNote 添加為第一個 TreeNote 的子節點。然後,將第一個子節點添加到 TreeView 的根節點中。
2、開發執行個體及程式源碼
2.1 使用前資料庫和IE Web控制項的準備工作
1)假如我們要建立如的數型結構
圖 1
圖1說明:器材管理、工地資訊、公用資訊是根節點,其餘是子節點。
2)在oracle資料庫中建立如表的資料庫表及欄位
圖 2
圖2 說明:在資料庫中設計欄位時將菜單等級確定下來,用流水號來表示唯一性。
圖 3
圖3說明:器材管理根節點的子節點,所屬主單序號001表明它要產生在器材管理之下。
圖 4
圖4說明:工地資訊根節點的子節點,所屬主單序號002表明它要產生在工地資訊之下。
圖 5
圖5說明:公用資訊根節點的子節點,所屬主單序號005表明它要產生在公用資訊之下。
3)IE Web控制項的準備工作
IE Web 控制項可以在安裝了 .NET Framework 版本 1.0 或 1.1 的 Web 服務器上使用,在內含代碼的類中使用 IE Web 控制項,首先需要右擊 Reference(引用),然後選擇 Add Reference(添加引用),將引用添加到 Microsoft.Web.UI.WebControls.dll 程式集中。然後,在內含代碼的類中,如果使用的是 C# ,則添加 using Microsoft.Web.UI.WebControls;
2.2 介面和程式設計
1) 上傳設計
1.1) Web介面如下
圖 6
圖6說明:在介面上對應設定控制項TreeView1.
1.2) 動態產生TreeView原始碼
1using Microsoft.Web.UI.WebControls;//添加控制項的引用
2
3private void GetTreeView()//程式開始
4{
5 try
6 {
7 string strSql = "SELECT DISTINCT Menu_id,Menu_name from docmodulemanager where Menu_level = 1 and sn in
8
9 ("+All.Substring(0,All.Length-1).ToString()+")";
10 OracleDataAdapter
11 objAdapter = new OracleDataAdapter(strSql,objConn);
12 DataSet ds = new DataSet();
13 ds.Clear ();
14 objAdapter.Fill(ds,"temp");
15 DataTable dt = ds.Tables["temp"];
16 TreeView1.Nodes.Clear();
17 //建立根節點,遍曆。
18
19 foreach(DataRow dr in dt.Rows)
20 {
21 TreeNode Root = new TreeNode();
22 Root.Text = dr["Menu_name"].ToString();
23 TreeView1.Nodes.Add(Root);//建立根節點
24 string str = "SELECT Menu_name,menu_addr,sn from docmodulemanager where upper_id = '" + dr["Menu_id"].ToString() + "' and sn in ("+menu_sn.Substring(0,menu_sn.Length-1).ToString()+")"+"order by menu_id,child_id";
25
26 OracleDataAdapter objAdapterNode = new OracleDataAdapter(str,objConn);
27 DataSet dsNode = new DataSet();
28 dsNode.Clear ();
29 objAdapterNode.Fill(dsNode,"tempNode");
30 DataTable dtNode = dsNode.Tables["tempNode"];
31
32 //建立子節點,遍曆。
33
34 foreach(DataRow drNode in dtNode.Rows)
35 {
36 TreeNode Node = new TreeNode();
37 Node.Text = drNode["Menu_name"].ToString();
38 Node.Target = "mainbottom";
39 string Path = drNode["menu_addr"].ToString();
40 int menusn = Convert.ToInt32(drNode["sn"].ToString());
41 Node.NavigateUrl = "Transfer.aspx"+"?menu_addr="+ Path;
42 Root.Nodes.Add(Node);//建立子節點
43 }
44 }
45}
46catch
47{
48 Response.Write(" alert('您沒有可操作的功能表項目,請與管理員聯絡!'); ");
49}
50finally
51{
52 if (objConn.State.ToString().Equals ("Open")) objConn.Close();
53}
54}
55
56