最近在網上找一些關於“ASP.NET母版頁TreeView導航鏈接問題”相關資料,很多人都碰到跟我類似的問題,於是我就抽了點時間自己調試一下這個問題了。
首先描述一下我的問題:
當把TreeView控件放到母版頁時,在做頁面導航鏈接的時候,TreeView控件的菜單狀態一直保持為最初設置的狀態,並不會像點擊某個頁面跳轉後還仍然保持點擊的那個狀態。
最簡單的方式,當然是用框架了。問題雖然很容易解決,可我還是想琢磨它一下,於是就寫了個調試程序來分享一下。程序比較粗糙,能達到我想要的效果就可以了,呵呵。 於是,我去MSDN裡面查找一下了關於TreeView控件的相關資料,然後再結合自己的思路,終於讓我寫出來了。
思路:在TreeView控件裡面我只設置了兩個級別(級別增加的話可能要另外再處理)。當我們點擊某一個父節點的時候,把當前父節點用SESSION會話存儲下來,點擊子節點時判斷該節點的父節點是否和SESSION的父節點一致,若是就將該父節點的子級展開,反之跳過。(最好用foreach遍歷該導航菜單)
在程序當中最關鍵的還是要了解一下TreeView控件的SelectAction屬性,這個屬性會涉及到一些控件相關事件,如下所示:
1、TreeNodeSelectAction.Expand:
使節點在展開和折疊狀態之間切換。相應地引發 TreeNodeExpanded 事件或 TreeNodeCollapsed 事件。
2、TreeNodeSelectAction.None:
在選定節點時不引發任何事件
3、TreeNodeSelectAction.Select:
在選定節點時引發 SelectedNodeChanged 事件
4、TreeNodeSelectAction.SelectExpand:
選擇節點時引發 SelectedNodeChanged 和 TreeNodeExpanded 事件。節點只會展開,不會折疊
在我的DEMO裡面我是應用了第一個和所關聯的兩個事件進行編寫的,代碼如下:
在母版頁內觸發以下三個事件:
母版頁PageLoad事件
1 protected void Page_Load(object sender, EventArgs e)
2 {
3 if (!IsPostBack)
4 {
5 //驗證當前Session中是否有節點
6 if (Session["treeNode"] != null)
7 {
8 TreeNode parentNode = Session["treeNode"] as TreeNode;
9 //遍歷TreeView的Nodes集合
10 foreach (TreeNode tn in this.TreeView1.Nodes)
11 {
12 //若循環節點的文本與當前節點的文本匹配,展開該節點;反之折疊
13 if (tn.Text.Trim() == parentNode.Text.Trim())
14 {
15 tn.Expand();
16 }
17 else
18 {
19 tn.Collapse();
20 }
21
22 }
23 }
24 }
25 }