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