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が表示されています。
コメント