
Crew .NET |
|
Ik heb even een voorbeeld gemaakt en dat werkt perfect (Voorbeeld). Het haalt de bedrijfsnaam en de opdrachten op uit de DB en tijdens het lezen worden die in ChildNodes gestopt om dan in de TreeView gezet te worden. Ze worden alfabetisch op bedrijfsnaam gesorteerd en de opdrachten binnen het bedrijf op ID. Onderstaande code heb ik in mijn Form_Load event staan:
'Variabelen declareren
Dim dbConn As New OleDbConnection(Connection.GetConnection())
Dim dbReader As OleDbDataReader
Dim strQuery = "SELECT Bedrijf, Naam FROM Opdracht ORDER BY Bedrijf, Id ASC"
Dim sqlComm As OleDbCommand = New OleDbCommand(strQuery, dbConn)
Dim parentNode As TreeNode
Dim oldValue As String = ""
Try
dbConn.Open()
dbReader = sqlComm.ExecuteReader()
While dbReader.Read()
'Als de vorige gelezen waarde (bedrijfsnaam) verschilt van
'de vorige: nieuwe TreeNode maken en toevoegen
If Not oldValue.Equals(dbReader.GetValue(0).ToString()) Then
parentNode = New TreeNode(dbReader.GetValue(0).ToString())
treeOpdrachten.Nodes.Add(parentNode)
End If
'Achteraf telkens de opdrachten toevoegen aan een bedrijf
parentNode.Nodes.Add(dbReader.GetValue(1).ToString())
'Laatst gelezen bedrijfsnaam opslaan om te vergelijken
oldValue = dbReader.GetValue(0).ToString()
End While
dbReader.Close()
Catch ex As Exception
MessageBox.Show(ex.Message, "Fout", MessageBoxButtons.OK, MessageBoxIcon.Information)
Finally
dbConn.Close()
End Try
'Variabelen declareren Dim dbConn As New OleDbConnection(Connection.GetConnection()) Dim dbReader As OleDbDataReader Dim strQuery = "SELECT Bedrijf, Naam FROM Opdracht ORDER BY Bedrijf, Id ASC" Dim sqlComm As OleDbCommand = New OleDbCommand(strQuery, dbConn) Dim parentNode As TreeNode Dim oldValue As String = "" Try dbConn.Open() dbReader = sqlComm.ExecuteReader() While dbReader.Read() 'Als de vorige gelezen waarde (bedrijfsnaam) verschilt van 'de vorige: nieuwe TreeNode maken en toevoegen If Not oldValue.Equals(dbReader.GetValue(0).ToString()) Then parentNode = New TreeNode(dbReader.GetValue(0).ToString()) treeOpdrachten.Nodes.Add(parentNode) End If 'Achteraf telkens de opdrachten toevoegen aan een bedrijf parentNode.Nodes.Add(dbReader.GetValue(1).ToString()) 'Laatst gelezen bedrijfsnaam opslaan om te vergelijken oldValue = dbReader.GetValue(0).ToString() End While dbReader.Close() Catch ex As Exception MessageBox.Show(ex.Message, "Fout", MessageBoxButtons.OK, MessageBoxIcon.Information) Finally dbConn.Close() End Try
Je zal zien dat als je de code in je Visual Studio, er in de volgende regel het eerste woord (parentNode) onderlijnd staat:
parentNode.Nodes.Add(dbReader.GetValue(1).ToString())
parentNode.Nodes.Add(dbReader.GetValue(1).ToString())
Dat is omdat je deze gebruikt alvorens ze een waarde te geven en er eventueel fouten kunnen optreden, maar aangezien je altijd zoizo eerst een ParentNode aanmaakt (immers, oldValue is gelijk aan "") zal dit geen problemen opleveren. Alleen als er een veld is in je DB waar de bedrijfsnaam leeg is én als dit de eerste gelezen waarde is, maar de kans dat dat gebeurt... 
Edit:
Ohja, nog iets. Eigenlijk zit je DB op deze manier niet goed in elkaar want als je echt veel gegevens gaat krijgen heb je veel dubbele gegevens. Je kan dan beter een aparte tabel voor de bedrijven maken met als kolommen (ID, Naam, ...). Dat ID gebruik je dan in plaats van de Naam nu, je moet dan enkel je query aanpassen. 
Veel succes!  |