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

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

コメント