iT邦幫忙

DAY 2
3

ASP.NET技巧系列 第 3

ASP.NET 2.0 使用資料表動態產生TreeView的樹狀結構 Part2

VS.NET2005已經將TreeView放入基本的元件,不過他的資料來源限定為XML檔案或者是Site Map,不過如果我們希望不同的使用者,依照不同的權限來瀏覽不同的網頁時,總不能每個使用者都訂立一個XML檔案來管理,於是小喵就開始尋找如何結合資料表的方式。

此外,當使用者進入系統後,如果每次瀏覽網頁都需要從資料庫撈取一次資料,並且組合一次Tree,小喵覺得似乎有點浪費資源,因此也順便透過Session機制,判斷如果沒有建立過Tree的話,就從資料庫撈資料建立TreeView,當在次瀏覽相關網頁時,如果判斷曾經建立過TreeView,就直接從Session中取回TreeView的結構並且直接顯示,這樣只需再配合一個小小的判斷最後變更權限的時間,來處理Session的存在與否,就能夠減少系統的資源浪費(重複建立撈取相同的TreeView結構)
遞回建立子節點函數(AddNodes)

此函數使用遞迴的方式,依照傳入的節點與節點代號,將傳入的節點以下的子節點取出並且建立節點,相關程式內容如下:

Function AddNodes() AddNodes(ByRef tNode As TreeNode, ByVal PId As Integer) As String
    '******** 遞迴增加樹結構節點 ********
    Try
        '如果Session中沒有DataTable→取得DataTable
        If Session("dt") Is Nothing Then
            Call GetDataTable()
        End If
        '定義DataTable
        Dim Dt As DataTable
        '從Session中取得DataTable
        Dt = Session("Dt")

        '定義DataRow承接DataTable篩選的結果
        Dim rows() As DataRow
        '定義篩選的條件
        Dim filterExpr As String
        filterExpr = "ParentId = " & PId
        '資料篩選並把結果傳入Rows
        rows = Dt.Select(filterExpr)

        '如果篩選結果有資料
        If rows.GetUpperBound(0) >= 0 Then


            Dim row As DataRow
            Dim tmpNodeId As Long
            Dim tmpsText As String
            Dim tmpsValue As String
            Dim tmpsUrl As String
            Dim tmpsTarget As String
            Dim NewNode As TreeNode
            Dim rc As String

            '逐筆取出篩選後資料
            For Each row In rows
                '放入相關變數中
                tmpNodeId = row(0)
                tmpsText = row(2)
                tmpsValue = row(3)
                tmpsUrl = row(4)
                tmpsTarget = row(5)

                '實體化新節點
                NewNode = New TreeNode
                '設定節點各屬性
                NewNode.Text = tmpsText
                NewNode.Value = tmpsValue
                NewNode.NavigateUrl = tmpsUrl
                NewNode.Target = tmpsTarget
                '將節點加入Tree中
                tNode.ChildNodes.Add(NewNode)

                '呼叫遞回取得子節點
                rc = AddNodes(NewNode, tmpNodeId)

            Next
        End If
        '傳回成功訊息
        AddNodes = "Success"

    Catch ex As Exception
        Me.lblMessage.Text = ex.Message
        AddNodes = "False"

    End Try
End Function

結語:
以上的示範是把樹狀結構使用資料表的方式存放,並且動態的反應到TreeView中,沒有包含權限控管的部份,如果需要權限控管,可以建立相關權限控管的資料表再與樹狀結構的內容Join。而為了避免每次都要讀取資料庫、建立樹狀結構等相關程式重複執行,透過Session的方式記錄了第一次建立後的結果。並且使用ADO.NET的特色,將撈回來的所有資料先存放到DataTable中,然後之後的資料篩選都是透過離線的DataTable來處理。各位實際在使用的時候可以搭配MasterPage來實做。

提供給大家參考討論^_^


上一篇
ASP.NET 2.0 使用資料表動態產生TreeView的樹狀結構 Part1
下一篇
ASP.NET的驗證與授權機制(動態錄影說明)
系列文
ASP.NET技巧17

尚未有邦友留言

立即登入留言