[ASP.NET]TreeViewとデータベースの連携

ASP.NET

TreeView コントロールをデータベースと連携させる

Treeive コントロールは階層表示ができるので、訪れたサイト閲覧者に対して案内が行いやすい。しかし階層数が膨大になったりノード数がと数万件もある場合、最初から全部のノード情報を読み込ませるわけにはいかない。それで、ノードをクリック(開く)毎に、子ノードをデータベースから取得してTreeViewを更新させるという方法が良い。

このサイトで使用しているソースコードを載せておきます

    Private Sub TreeView1_TreeNodePopulate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.TreeNodeEventArgs) Handles TreeView1.TreeNodePopulate

        Dim myServiceId As Byte = Split(e.Node.Value, ":")(0)
        Dim myCategoryId As Long = Split(e.Node.Value, ":")(1)

        If e.Node.ChildNodes.Count <> 0 Then Exit Sub

        If myServiceId = 0 Then
            myServiceId = myCategoryId
            myCategoryId = 0
        End If

        Page.Focus()

        Me.CreateNode(myServiceId, myCategoryId, e.Node.ChildNodes)


    End Sub



' 指定された親IDをノードとするノード群をツリーに追加
    Private Sub CreateNode(ByVal serviceID As Byte, _
                            ByVal parentID As Long, _
                            ByRef nodes As System.Web.UI.WebControls.TreeNodeCollection)



        '--------SQLSERVER---------
        Dim stConnectionString As String = ConfigurationManager.ConnectionStrings("tkauctionConnectionString").ConnectionString
        Dim hConnection As System.Data.SqlClient.SqlConnection

        ' SqlConnection の新しいインスタンスを生成する (接続文字列を指定)
        hConnection = New Data.SqlClient.SqlConnection(stConnectionString)
        Dim cmd As Data.SqlClient.SqlCommand = hConnection.CreateCommand()

        hConnection.Open()


        cmd.CommandText = "SELECT                      T_category.serviceid, T_category.categoryId, T_category.categoryName, T_category.categoryImageURL, " _
                            & "             T_category.getedpageend " _
                            & "FROM      T_category LEFT OUTER JOIN " _
                            & "  T_serviceIDOrder ON T_category.categoryId = T_serviceIDOrder.serviceID " _
                            & "WHERE  (T_category.serviceid = " & serviceID & ") " _
                            & " AND (T_category.parentCategoryId =" & parentID & ")" _
                            & "AND (T_category.outView = 0) " _
                            & "ORDER BY T_serviceIDOrder.serviceIDOrder, T_category.categoryName "



        Dim DR As Data.SqlClient.SqlDataReader = cmd.ExecuteReader


        ' 取得したコンテンツを新規ノードとして現在ノードの配下に追加
        Do While DR.Read()
            Dim node As New System.Web.UI.WebControls.TreeNode()
            node.NavigateUrl = "./?s=" & DR("serviceid").ToString & "&c=" & DR("categoryid") ' リンク先

            node.ImageUrl = DR("categoryImageURL").ToString

            Dim nodeText = DR("categoryName").ToString
            If nodeText.Length > 30 Then
                nodeText = nodeText.Insert(30, "<br />")
            End If

            If nodeText.Length > 65 Then
                nodeText = nodeText.Insert(65, "<br />")
            End If

            If DR("getedpageend") = False Then nodeText &= " *"

            node.Text = nodeText

            node.Value = serviceID & ":" & DR("categoryID").ToString ' ノード値
            node.PopulateOnDemand = True ' オンデマンドで子ノードを取得するか
            nodes.Add(node)
        Loop

        DR.Close()
        hConnection.Close()
        hConnection.Dispose()

    End Sub

treeview

このブログを書いている時点で4万1千件ほどのカテゴリ情報がデータベースに登録されていますが、ノードを展開するときにのみ子ノードを取得しているので、比較的ストレスなくTreeviewが表示されています。

コメント

スポンサーリンク
タイトルとURLをコピーしました