Asp.Net

TreeView aus Datenbank befüllen

15. 02. 2011

Oft ist es nötig, aus einer Liste von Daten eine hierarchische Darstellung zu generieren. Hier bietet sich das TreeView-Steuerelement an.

Im Folgenden findet sich der Quellcode, den ich verwendet habe, um ein TreeView zu befüllen. Man kann dies als Ausgangsmaterial verwenden, um es an die eigenen Bedürfnisse anzupassen.

Voraussetzungen

  • Es gibt eine Datentabelle mit dem Namen qryKunden, die aus den Spalten id, parentid und title besteht. Die Spalte id ist eine Schlüsselspalte; jeder Eintrag hat eine eindeutige Nummer. In parentid ist die eindeutige Nummer des übergeordneten Elements (z. B. des Vorgesetzten) gespeichert, unter title z. B. der Name.
  • Bei mir liegen die Daten aus einem SQL-Express-Server. Grundsätzlich ist dies unerheblich, es muss aber natürlich der QueryString angepasst werden.
  • In der aspx-Seite wurde ein TreeView-Steuerelement mit dem Namen „TreeView1“ erstellt.

Quellcode

Imports System.Data
 
Partial Class Struktur_Main
    Inherits System.Web.UI.Page
 
    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
 
        'Die erste Ebende des Baumes wird befüllt
        If Not Page.IsPostBack Then
            PopulateRootLevel()
        End If
    End Sub
 
    Private Sub PopulateRootLevel()
 
        'Die erste Ebene ist der User mit der Id, die in der Session-Variable "sesUserID" abgespeichert ist
        'Durch das richtige SQL-Kommando erhalten wir genau diesen
        Dim objConn As New Data.SqlClient.SqlConnection("Data Source=S3\SQLEXPRESS;Initial Catalog=EPV02;Persist Security Info=True;User ID=sa;Password=...")
        Dim objCommand As New Data.SqlClient.SqlCommand("select id,title,Erstempfehlung,Aktiv,Telefon,(select count(*) FROM qryKunden WHERE parentid=sc.id) childnodecount FROM qryKunden sc WHERE (id=" & CInt(Session("sesUserID")) & ")", objConn)
 
        Dim da As New Data.SqlClient.SqlDataAdapter(objCommand)
        Dim dt As New DataTable()
        da.Fill(dt)
 
        'Nun wird die Datentabelle (sollte 1 Eintrag beinhalten), in das TreeView-Objekt gezeichnet
        PopulateNodes(dt, TreeView1.Nodes)
    End Sub
 
    'Prozedur zum Eintragen der Inhalte der Datentabelle in das TreeView
    Private Sub PopulateNodes(ByVal dt As DataTable, ByVal nodes As TreeNodeCollection)
        For Each dr As DataRow In dt.Rows
            Dim tn As New TreeNode()
            tn.Text = dr("title").ToString() & " (" & dr("Telefon").ToString() & ")"
            tn.Value = dr("id").ToString()
            tn.NavigateUrl = ""
            tn.SelectAction = TreeNodeSelectAction.Expand
            If dr("Aktiv") Then
                If dr("Erstempfehlung") Then
                    tn.ImageUrl = "used/buttons/btn_red.jpg"
                Else
                    tn.ImageUrl = "used/buttons/btn_green.jpg"
                End If
            Else
                tn.ImageUrl = "used/buttons/btn_gray.jpg"
            End If
 
 
            nodes.Add(tn)
 
            'Wenn der Node Kinder hat, wird das "Ausklappen" aktiviert
            tn.PopulateOnDemand = (CInt(dr("childnodecount")) > 0)
        Next
    End Sub
 
    Private Sub PopulateSubLevel(ByVal parentid As Integer, ByVal parentNode As TreeNode)
        'Nach Übergabe der parentID werden die Child-Nodes in die Daten-Tabelle geladen und mit obiger Funktion gezeichnet
        Dim objConn As New Data.SqlClient.SqlConnection("Data Source=S3\SQLEXPRESS;Initial Catalog=EPV02;Persist Security Info=True;User ID=sa;Password=...")
        Dim objCommand As New Data.SqlClient.SqlCommand("select id,title,Erstempfehlung,Aktiv,Telefon,(select count(*) FROM qryKunden WHERE parentid=sc.id) childnodecount FROM qryKunden sc where ((parentID=@parentID) AND (id<>1)) ORDER BY Erstempfehlung DESC", objConn)
        objCommand.Parameters.Add("@parentID", SqlDbType.Int).Value = parentid
 
        Dim da As New Data.SqlClient.SqlDataAdapter(objCommand)
        Dim dt As New DataTable()
        da.Fill(dt)
        PopulateNodes(dt, parentNode.ChildNodes)
    End Sub
 
    Protected Sub TreeView1_TreeNodePopulate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.TreeNodeEventArgs) Handles TreeView1.TreeNodePopulate
        'Sobald ein neuer Zweig ausgeklappt wird, wird diese Prozedur ausgeführt
        PopulateSubLevel(CInt(e.Node.Value), e.Node)
    End Sub
End Class

Quelle

image_print
1 Stern2 Sterne3 Sterne4 Sterne5 Sterne
Loading...

Author

Manuel