最近在網(wǎng)上找一些關(guān)于“asp.net母版頁(yè)TreeView導(dǎo)航鏈接問(wèn)題”相關(guān)資料,很多人都碰到跟我類(lèi)似的問(wèn)題,于是我就抽了點(diǎn)時(shí)間自己調(diào)試一下這個(gè)問(wèn)題了。
首先描述一下我的問(wèn)題:
當(dāng)把TreeView控件放到母版頁(yè)時(shí),在做頁(yè)面導(dǎo)航鏈接的時(shí)候,TreeView控件的菜單狀態(tài)一直保持為最初設(shè)置的狀態(tài),并不會(huì)像點(diǎn)擊某個(gè)頁(yè)面跳轉(zhuǎn)后還仍然保持點(diǎn)擊的那個(gè)狀態(tài)。
最簡(jiǎn)單的方式,當(dāng)然是用框架了。問(wèn)題雖然很容易解決,可我還是想琢磨它一下,于是就寫(xiě)了個(gè)調(diào)試程序來(lái)分享一下。程序比較粗糙,能達(dá)到我想要的效果就可以了,呵呵。 于是,我去MSDN里面查找一下了關(guān)于TreeView控件的相關(guān)資料,然后再結(jié)合自己的思路,終于讓我寫(xiě)出來(lái)了。
思路:在TreeView控件里面我只設(shè)置了兩個(gè)級(jí)別(級(jí)別增加的話(huà)可能要另外再處理)。當(dāng)我們點(diǎn)擊某一個(gè)父節(jié)點(diǎn)的時(shí)候,把當(dāng)前父節(jié)點(diǎn)用session會(huì)話(huà)存儲(chǔ)下來(lái),點(diǎn)擊子節(jié)點(diǎn)時(shí)判斷該節(jié)點(diǎn)的父節(jié)點(diǎn)是否和SESSION的父節(jié)點(diǎn)一致,若是就將該父節(jié)點(diǎn)的子級(jí)展開(kāi),反之跳過(guò)。(最好用foreach遍歷該導(dǎo)航菜單)
在程序當(dāng)中最關(guān)鍵的還是要了解一下TreeView控件的SelectAction屬性,這個(gè)屬性會(huì)涉及到一些控件相關(guān)事件,如下所示:
1、TreeNodeSelectAction.Expand:
使節(jié)點(diǎn)在展開(kāi)和折疊狀態(tài)之間切換。相應(yīng)地引發(fā) TreeNodeExpanded 事件或 TreeNodeCollapsed 事件。
2、TreeNodeSelectAction.None:
在選定節(jié)點(diǎn)時(shí)不引發(fā)任何事件
3、TreeNodeSelectAction.Select:
在選定節(jié)點(diǎn)時(shí)引發(fā) SelectedNodeChanged 事件
4、TreeNodeSelectAction.SelectExpand:
選擇節(jié)點(diǎn)時(shí)引發(fā) SelectedNodeChanged 和 TreeNodeExpanded 事件。節(jié)點(diǎn)只會(huì)展開(kāi),不會(huì)折疊
在我的DEMO里面我是應(yīng)用了第一個(gè)和所關(guān)聯(lián)的兩個(gè)事件進(jìn)行編寫(xiě)的,代碼如下:
在母版頁(yè)內(nèi)觸發(fā)以下三個(gè)事件:
母版頁(yè)P(yáng)ageLoad事件
1 PRotected void Page_Load(object sender, EventArgs e)
2 {
3 if (!IsPostBack)
4 {
5 //驗(yàn)證當(dāng)前Session中是否有節(jié)點(diǎn)
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 //若循環(huán)節(jié)點(diǎn)的文本與當(dāng)前節(jié)點(diǎn)的文本匹配,展開(kāi)該節(jié)點(diǎn);反之折疊
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 }
TreeView展開(kāi)事件
1 protected void TreeView1_TreeNodeExpanded(object sender, TreeNodeEventArgs e)
2 { //獲取當(dāng)前節(jié)點(diǎn)
3 TreeNode currentNode = e.Node;
4 //驗(yàn)證當(dāng)前Session中是否有節(jié)點(diǎn)
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 //若循環(huán)節(jié)點(diǎn)的文本與當(dāng)前節(jié)點(diǎn)的文本不匹配,將其余節(jié)點(diǎn)折疊
12 if (tn.Text.Trim() != currentNode.Text.Trim())
13 {
14 tn.Collapse();
15 }
16 }
17
18
19 }
20 //存儲(chǔ)當(dāng)前節(jié)點(diǎn)
21 Session["treeNode"] = currentNode;
22 }
TreeView折疊事件
1 protected void TreeView1_TreeNodeCollapsed(object sender, TreeNodeEventArgs e)
2 {
3 //移除存儲(chǔ)的節(jié)點(diǎn)
4 Session.Remove("treeNode");
5 }
另外,個(gè)人還有一個(gè)想法就是通過(guò)動(dòng)態(tài)綁定來(lái)實(shí)現(xiàn)多級(jí)的菜單會(huì)更合適點(diǎn),遍歷節(jié)點(diǎn)的時(shí)候,我覺(jué)得還是用它的Value值來(lái)判斷最好,而不是用文本。DEMO里面還有一個(gè)是用框架實(shí)現(xiàn)的,效果一樣。
以上就是解決標(biāo)題問(wèn)題的一個(gè)簡(jiǎn)短DEMO,比較粗糙,望高手有更好的方法可以交流一下,謝謝。
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注