最近在網上找一些關於“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 &n
bsp; {
15 tn.Expand();
16 }
17 else
18 {
19 tn.Collapse();
20 }
21
22 }
23 }
24 }
25 }
TreeVIEw展開事件
1 protected void TreeVIEw1_TreeNodeExpanded(object sender, TreeNodeEventArgs e)
2 { //獲取當前節點
3 TreeNode currentNode = e.Node;
4 //驗證當前Session中是否有節點
5 if (Session["treeNode"] != null)
6 {
7 TreeNode node = Session["treeNode"] as TreeNode;
8 //遍歷TreeVIEw的Nodes集合
9 foreach (TreeNode tn in this.TreeVIEw1.Nodes)
10 {
11 //若循環節點的文本與當前節點的文本不匹配,將其余節點折疊
12 if (tn.Text.Trim() != currentNode.Text.Trim())
13 {
14 tn.Collapse();
15 }
16 }
17
18
19 }
20 //存儲當前節點
21
Session["treeNode"] = currentNode;
22 }
TreeVIEw折疊事件
1 protected void TreeVIEw1_TreeNodeCollapsed(object sender, TreeNodeEventArgs e)
2 {
3 //移除存儲的節點
4 Session.Remove("treeNode");
5 }
另外,個人還有一個想法就是通過動態綁定來實現多級的菜單會更合適點,遍歷節點的時候,我覺得還是用它的Value值來判斷最好,而不是用文本。DEMO裡面還有一個是用框架實現的,效果一樣。
以上就是解決標題問題的一個簡短DEMO,比較粗糙,望高手有更好的方法可以交流一下,謝謝。