Asp.net TreeView控件使用總結


近段時間公司的一套系統開發時用到了Asp.net自帶的TreeView控件,經過幾天的努力,把一些遇到的問題和解決方法寫下,方便以后查找。

TreeView 控件用於在樹結構中顯示分層數據,例如目錄或文件目錄。TreeNode表示樹的節點信息。填充節點有三個方式,一是靜態數據,即在頁面上使用標簽<asp:TreeNode>。第二種是數據綁定,TreeView可以綁定到實現 IHierarchicalDataSource 接口的任意數據源控件。重點介紹的是第三種,動態數據填充,也是比較常用的,因為無論是靜態數據還是數據綁定,都是一次性將節點填充完成,可能會返回大量數據,同時,如果要顯示的信息取決於運行時的所獲取的信息,就只有通過動態填充節點了。

使TreeView控件支持動態節點填充,首先將節點的屬性PopulateOnDemand設置為true,並且必須定義一個事件處理方法,它包含 TreeNodePopulate 事件所用的填充節點的邏輯。

關於節點TreeNode,Text表示節點顯示的文字,Value表示節點的值,可以用來存儲跟節點有關的任何值,回發時使用;ValuePath表示從根節點到當前節點的路徑,由分隔符連接的節點值(下面會用到);NavigateUrl表示節點鏈接的地址,SelectAction表示點擊節點時的動作,有兩個選擇,Expand打開節點,Select選中節點。生成的Html是一個<a>標簽,如果想自定義一個onclick事件,可以設置節點的Text等於類似<span id='' onclick=''></span>.

當節點填充完成后,如你在瀏覽器中打開一個節點,第一次打開時,會觸發服務器的TreeNodePopulate事件,事件邏輯填充子節點。然后關閉該節點,第二次打開該節點時,就不會回發到服務器了,相當於剛才的關閉只是暫時隱藏了子節點,而第二次打開時,再把子節點設置為顯示。(以上只是我的理解,希望不要誤導您。具體是如何,沒有去深究)。但是如果此時用戶插入了新的數據到剛才打開的節點下面,用戶想要看到這個新的節點,靠關閉再打開父節點是不管用的,上面已經說了,只有第一次打開節點時才會觸發節點填充事件。其中的一個解決方案是把這個節點的子節點清空,然后手動填充子節點。問題是如何找到這個新添加的節點(還沒有添加到樹上)的父節點。這就用到了上面提到的ValuePath屬性,根據具體的業務邏輯,肯定可以得到新添加節點的ValuePath值,我們知道ValuePath表示的是從根節點到當前節點的路徑,也就是說得到ValuePath的值,也就得到了到達該節點的路徑上所有的節點。用類似於下面的算法

 

 1 TreeView locateTree = this.locateTreeInfo.TreeView1; 
 2             char[] spitChar = new char[] { '/' };
 3             string[] nodeValues = valuePath.Split(spitChar);
 4             int count = nodeValues.Length;
 5             string iValue = string.Empty;
 6             for (int iLoop = 0; iLoop < count; iLoop++)
 7             {
 8                 iValue = iLoop == 0 ? nodeValues[iLoop] : iValue + "/" + nodeValues[iLoop];
 9                 node = locateTree.FindNode(iValue);
10                 if (node == null)
11                 {
12                     break;
13                 }
14                 else
15                 {
16                     if (iLoop == count - 1) break;
17                     node.Expand();
18                 }
19             }

 

 

一層層打開節點,並最終找到目標節點。

可以看出,微軟的服務器控件封裝了很多東西,但也帶來了性能的影響,替換的解決方案是javascript+ajax,這就要求編寫更多的s代碼了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM