在Asp.net中我們知道TreeView控件可以實現站點導航功能,利用模板加上站點地圖作為TreeView的DataSource就可以實現輕松的導航功能。我本次所要實現的導航拋開了模板和站點地圖,利用框架動態實現導航。
我們知道,TreeView控件可以靜態的預定義其結構,支持的數據源控件有XmlDataSource 和 SiteMapDataSource ,並不支持sqldatasource控件。這次我們的數據源正是數據庫,所以我們可以動態的填充TreeView的節點。在實現TreeView的動態填充節點後,我們可以利用iframe框架,來實現導航。
一.對TreeView控件本次所要用到的屬性及事件的介紹
1.TreeNode.SelectAction屬性:獲取或設置選擇節點時引發的事件,此屬性的值為TreeNodeSelectAction 值之一,默認為TreeNodeSelectAction.Select。TreeView的文本節點可以處於兩種模式之一,默認情況下,會有一個節點處於選定狀態,即TreeNodeSelectAction.Select,此模式下引發SelectedNodeChanged事件,引發後節點只會展開,不會折疊。若要使一個節點處於導航模式,可以把該節點的 NavigateUrl 屬性值設置為空字符串 ("") 以外的值。若要使節點處於選擇模式,可以把節點的 NavigateUrl 屬性設置為空字符串。
2.TreeNode.PopulateOnDemand屬性:該屬性只為bool類型,獲取或設置一個值,該值指示是否動態填充節點,默認為false。當節點的 PopulateOnDemand 屬性設置為 true 時,在運行階段展開節點時通過回發事件填充節點。若要動態填充節點,必須為 TreeNodePopulate 事件定義填充節點的事件處理方法。
3.TreeNode.TreeNodePopulate事件:當節點的 PopulateOnDemand 屬性設置為 true 時,可以觸發該事件,以編程的方式動態填充節點。
二.實現TreeView的動態填充節點.
1.由於是獲取數據裡面的數據,於是寫了個SqlHelper類,我前面的一篇文章詳細敘述過,裡面同樣介紹了數據庫的關系圖,感興趣的朋友可以參考對DataList控件綁定圖片的一點小結 裡的部分內容,這裡為了不影響閱讀,把代碼還是貼出來了:
DALHelper類
1using System;
2using System.Collections.Generic;
3using System.Linq;
4using System.Text;
5using System.Configuration;
6using System.Data;
7using System.Data.SqlClient;
8namespace DBHelper
9{
10 public class DALHelper
11 {
12 private static string constr = ConfigurationManager.ConnectionStrings["MyNBAData"].ConnectionString;
13 private static SqlConnection connection = new SqlConnection(constr);
14
15 /**//// <summary>
16 /// 檢查連接是否打開
17 /// </summary>
18 public static bool CheckConnOpen()
19 {
20 if (connection == null || connection.State == ConnectionState.Closed)
21 {
22 connection.Open();
23 return true;
24 }
25 else
26 {
27 return false;
28 }
29 }
30 /**//// <summary>
31 /// 檢查連接是否關閉
32 /// </summary>
33 public static bool CheckConnClosed()
34 {
35 if (connection != null || connection.State == ConnectionState.Open)
36 {
37 connection.Close();
38 return true;
39 }
40 else
41 {
42 return false;
43 }
44 }
45
46 /**//// <summary>
47 /// 獲取一個DataTable
48 /// </summary>
49 /// <param name="sql"></param>
50 /// <returns></returns>
51 public static DataTable GetDataTable(string sql)
52 {
53 SqlDataAdapter da = null;
54 DataTable dt = null;
55 try
56 {
57 da = new SqlDataAdapter(sql, connection);
58 dt = new DataTable();
59 da.Fill(dt);
60 }
61 catch (Exception ex)
62 {
63
64 throw new Exception(ex.Message);
65 }
66
67 return dt;
68 }
69
70 /**//// <summary>
71 /// 獲取DataReader對象
72 /// </summary>
73 /// <param name="sql"></param>
74 /// <param name="parms"></param>
75 /// <returns></returns>
76 public static SqlDataReader ExecuteReader(string sql, SqlParameter[] parms)
77 {
78 SqlCommand command= null;
79 SqlDataReader reader = null;
80 try
81 {
82 command = new SqlCommand(sql, connection);
83 if (parms!=null)
84 {
85 foreach (var item in parms)
86 {
87 command.Parameters.Add(item);
88 }
89 }
90 if( CheckConnOpen())
91 {
92 reader = command.ExecuteReader(CommandBehavior.CloseConnection);
93 }
94
95
96 }
97 catch (Exception ex)
98 {
99
100 throw new Exception(ex.Message);
101 }
102 finally
103 {
104 //CheckConnClosed();
105 }
106 return reader;
107 }
108
109 /**//// <summary>
110 /// 執行數據庫的修改,插入,刪除
111 /// </summary>
112 /// <param name="sql"></param>
113 /// <param name="parms"></param>
114 /// <returns></returns>
115 public static int ExecuteNonQuery(string sql, SqlParameter[] parms)
116 {
117 SqlCommand command = null;
118 int count = 0;
119 try
120 {
121 command = new SqlCommand(sql, connection);
122 if (parms!=null)
123 {
124 foreach (var item in parms)
125 {
126 command.Parameters.Add(item);
127 }
128 }
129
130 CheckConnOpen();
131 count = command.ExecuteNonQuery();
132 }
133 catch (Exception ex)
134 {
135
136 throw new Exception(ex.ToString());
137 }
138 finally
139 {
140 CheckConnClosed();
141 }
142 return count;
143 }
144 }
145}
146