Private Sub FillTree()
Dim sqlCon As New SqlConnection("server=(local);database=Reading;trusted_connection=true;")
' Level 0 Node(s) or the root
Dim sqlLevel0 As New SqlDataAdapter("SELECT * FROM [Menu] WHERE [PARENT_ID] = '0'", sqlCon)
Dim dataLevel0 As New DataTable
sqlLevel0.Fill(dataLevel0)
For i As Integer = 0 To dataLevel0.Rows.Count - 1
TreeView1.Nodes.Add(dataLevel0.Rows(i).Item("DESCR").ToString())
' Level 1 Nodes
Dim sqlLevel1 As New SqlDataAdapter("SELECT * FROM [Menu] WHERE [PARENT_ID] = '" + dataLevel0.Rows(i).Item("CAT_ID").ToString() + "'", sqlCon)
Dim dataLevel1 As New DataTable
sqlLevel1.Fill(dataLevel1)
For j As Integer = 0 To dataLevel1.Rows.Count - 1
TreeView1.Nodes(i).Nodes.Add(dataLevel1.Rows(j).Item("DESCR").ToString())
' Level 2 Nodes
Dim sqlLevel2 As New SqlDataAdapter("SELECT * FROM [Menu] WHERE [PARENT_ID] = '" + dataLevel1.Rows(j).Item("CAT_ID").ToString() + "'", sqlCon)
Dim dataLevel2 As New DataTable
sqlLevel2.Fill(dataLevel2)
For k As Integer = 0 To dataLevel2.Rows.Count - 1
TreeView1.Nodes(i).Nodes(j).Nodes.Add(dataLevel2.Rows(k).Item("DESCR").ToString())
' Level 3 Nodes
Dim sqlLevel3 As New SqlDataAdapter("SELECT * FROM [Menu] WHERE [PARENT_ID] = '" + dataLevel2.Rows(k).Item("CAT_ID").ToString() + "'", sqlCon)
Dim dataLevel3 As New DataTable
sqlLevel3.Fill(dataLevel3)
For m As Integer = 0 To dataLevel3.Rows.Count - 1
TreeView1.Nodes(i).Nodes(j).Nodes(k).Nodes.Add(dataLevel3.Rows(m).Item("DESCR").ToString())
Next
Next
Next
Next
End Sub