This blog has personalition features for you, the reader. Below is a key of what all the icons mean and which aspects of the layout they change.
Close Window
前言:
VS.NET2005已經將TreeView放入基本的元件,不過他的資料來源限定為XML檔案或者是Site Map,不過如果我們希望不同的使用者,依照不同的權限來瀏覽不同的網頁時,總不能每個使用者都訂立一個XML檔案來管理,於是小喵就開始尋找如何結合資料表的方式。
此外,當使用者進入系統後,如果每次瀏覽網頁都需要從資料庫撈取一次資料,並且組合一次Tree,小喵覺得似乎有點浪費資源,因此也順便透過Session機制,判斷如果沒有建立過Tree的話,就從資料庫撈資料建立TreeView,當在次瀏覽相關網頁時,如果判斷曾經建立過TreeView,就直接從Session中取回TreeView的結構並且直接顯示,這樣只需再配合一個小小的判斷最後變更權限的時間,來處理Session的存在與否,就能夠減少系統的資源浪費(重複建立撈取相同的TreeView結構)
樹狀結構的資料表設計:
要設計樹狀結構,希望能夠設計出無限層(無限深度)、無限項目的數,小喵的資料表欄位設計如下:
說明:
ASP.NET前置作業:
接著開啟一個aspx檔案,並且再畫面上安排一個PlaceHolder控制項,然後在空白地方點兩下,開始撰寫PageOnLoad事件的相關程式
Imports
由於會存取資料庫,所以先將資料庫相關的命名空間Imports進來
編輯Page_Load事件
我們希望在Page_Load的時候,檢查一下是否曾經建立過TreeView,如果有,直接從Session取得TreeView,如果沒有→建立TreeView。 接著就是設定TreeView的ImageSet後,放入PlaceHolder中,相關程式碼如下:
初始化TreeView:
在Page_Load中有呼叫初始化TreeView的Sub,接著就來看看初始化TreeView中做了哪些事情。由於一開始還沒有TreeView物件,所以先宣告並實體化TreeView,並且設定【根目錄】節點的相關內容,並指定他回首頁的超鏈結,這部份是靜態的,跟資料庫無關。最後把該Tree放入Session中。
建立樹狀結構程序:
在InitTree程序後,接著是要建立樹狀結構的程序。首先會檢查一下資料是否曾經取得過,如果沒有的話,呼叫取得資料的程序GetDataTable()。接著取得根目錄的節點,然後呼叫新增子節點的Function AddNodes並且傳入【根目錄】節點與根目錄的代號【0】 相關的程式如下:
取得資料的程序:
接著是取得資料,並且把DataTable放入Session的相關程式內容如下:
遞回建立子節點函數(AddNodes)
此函數使用遞迴的方式,依照傳入的節點與節點代號,將傳入的節點以下的子節點取出並且建立節點,相關程式內容如下:
結語:
以上的示範是把樹狀結構使用資料表的方式存放,並且動態的反應到TreeView中,沒有包含權限控管的部份,如果需要權限控管,可以建立相關權限控管的資料表再與樹狀結構的內容Join。而為了避免每次都要讀取資料庫、建立樹狀結構等相關程式重複執行,透過Session的方式記錄了第一次建立後的結果。並且使用ADO.NET的特色,將撈回來的所有資料先存放到DataTable中,然後之後的資料篩選都是透過離線的DataTable來處理。各位實際在使用的時候可以搭配MasterPage來實做。
提供給大家參考討論^_^
2008/03/05補充:
後來小喵並沒有使用Session來存放TreeView或者DataTable,也沒有把TreeView放在MasterPage,原因是存放在Session會造成Server記憶體的負擔,而放在MasterPage則是每次瀏覽都要從資料庫撈一次並且遞迴一次,最後小喵還是選擇以往的方式:切割Frame,讓TreeView放在Frame裡面,雖然美觀讓比較沒那麼好,不過在校能與Server的資源使用上卻會有正向的幫忙。提供小喵的經驗給大家參考
^_^
Microsoft MVP ASP/ASP.NET
topcatBlog:http://www.dotblogs.com.tw/topcat
posted on 2008/3/5 14:34 | 我要推薦 | 閱讀數 : 3242 | 分類[ (.NET)ASP.NET ASP.NET權限控管 ] 訂閱
好文,辛苦了
謝謝喵大大的文章!其實還不太了解TreeView,個人比較熟DataTable請問如果用DataTable儲存用戶的權限,而將它放在Frame裡,是不是對Server的資源沒有太大的負擔,用戶瀏覽的速度也不會太慢?但有個問題,將datatable放在LEFT Frame裡,RIGHT FRAME 可以讀取放在LEFT FRAME 的 datatable嗎?因為有時並非讀寫權限這麼簡單。在此先謝
to 新手 : >>如果用DataTable儲存用戶的權限,而將它放在Frame裡,是不是對Server的資源沒有太大的負擔,用戶瀏覽的速度也不會太慢?
是...小喵也是將TreeView放在左邊的Frame,其他的頁面放在右邊的Frame。這樣的設計會比放在MasterPage效能上應該會好很多,因為只有在整個網頁進來的時候撈取一次就可以了。如果放在MasterPage,這樣每次PostBack的時候都還要再多處裡一次TreeView,並且TreeView的展開狀態也保持不易。
>>將datatable放在LEFT Frame裡,RIGHT FRAME 可以讀取放在LEFT FRAME 的 datatable嗎?因為有時並非讀寫權限這麼簡單。
小喵在權限控管上,並沒有從右邊的Frame去讀取左邊Frame的需求。不知道您的設計方式如何??為何有需要去左邊讀取呢??
喵大大,你將用戶的權限放在LEFT FRAME 的treeview裡,是怎樣控制RIGHT FRAME 頁面用戶的權限,如某角色用戶可以看多一些資料、修改已"確認完成"的資料其實我想知道是不是可以在用戶登入時,將用戶的權限、所有相關資料放在datatable往後瀏覽不同頁面都不用再次回server 取得用戶的權限,直接用回登入時取得的資料作權限控管在此先謝
to 新手 : 小喵的方式是這樣的
左邊的TreeView是依據使用者,讀取該使用者有權限的項目,列出樹狀目錄。
右邊的頁面,則是透過PageBase的方式(http://www.dotblogs.com.tw/topcat/archive/2008/03/05/1250.aspx)來進行頁面的驗證工作。
詳細的方式規劃方式請參考以下裡的幾篇http://www.dotblogs.com.tw/topcat/category/1499.aspx
*必要欄位
目前線上人數: