This code will build a TreeView from a Database with an infinite number of levels and will retain the EXACT TreeView Structure as when built. This code would need to be modified for your database BUT the method in which it builds the TreeView can be used in any situation. Here you go:

VB Code:
  1. 'TreeView Functions/Subs
  2. Public Sub Create_Tree()
  3.     Dim TreeRec As ADODB.Recordset
  4.     Dim TreeStr As String
  5.     Dim TreeNode As Node
  6.     Dim TreeKey As String
  7.     Dim TreeText As String
  8.    
  9.     Set TreeCon = CreateObject("ADODB.Connection")
  10.     TreeCon.ConnectionString = "Provider=OraOLEDB.Oracle;" & _
  11.                              "Data Source=QSDB;" & _
  12.                              "User ID=QSDB_USER;" & _
  13.                              "Password=5star5;"
  14.    
  15.     'Open Connection
  16.     TreeCon.Open
  17.    
  18.     tvPS.Nodes.Clear
  19.     tvPS.Nodes.Add , , gbtxtPartName & "_PART", gbtxtPartName 'gbtxtPartName is a variable that houses the ROOT Nodes Text
  20.    
  21.     Set TreeRec = New ADODB.Recordset
  22.     TreeStr = "SELECT RT_IMKEY,RT_WCKEY Item,RT_SEQNUM SeqNum,RT_OP_NUM OpNum,'_PRO' IconType FROM RT WHERE RT_IMKEY = '" & gbtxtPartName & "'" & _
  23.                "UNION " & _
  24.                "SELECT PS_IMKEY,PS_CPKEY Item,PS_SEQNUM SeqNum,PS_OP_NUM OpNum,'_MAT' IconType FROM PS WHERE PS_IMKEY = '" & gbtxtPartName & "' Order By OpNum"
  25.     TreeRec.Open TreeStr, TreeCon, adOpenStatic, adLockOptimistic, adCmdText
  26.     TreeRec.MoveFirst
  27.     Do While Not TreeRec.EOF 'Adds current level of nodes
  28.         Set TreeNode = tvPS.Nodes.Add((gbtxtPartName & "_PART"), tvwChild, gbtxtPartName & "_" & TreeRec!Item & "_" & TreeRec!OpNum & TreeRec!IconType, TreeRec!Item) 'Sets new node as current node for next Sub
  29.         TreeKey = TreeNode.Key
  30.         TreeText = TreeNode.Text
  31.         TreeRec.MoveNext
  32.     Loop
  33.     Call Walk_Tree(TreeNode)
  34. End Sub
  35. Private Sub Walk_Tree(ByVal TreeNode As Node)
  36.     Dim i As Integer
  37.     Set TreeNode = TreeNode.Parent
  38.     Set TreeNode = TreeNode.Child
  39.    
  40.     Do 'Walks TreeView
  41.         Call Query_Node(TreeNode)
  42.         Set TreeNode = TreeNode.Next
  43.     Loop Until TreeNode Is Nothing
  44. End Sub
  45. Private Sub Query_Node(ByVal TreeNode As Node)
  46.     Dim TreeNode1 As Node
  47.     Dim NodeRec As ADODB.Recordset
  48.     Dim NodeStr As String
  49.    
  50.     Set NodeRec = New ADODB.Recordset
  51.     NodeStr = "SELECT RT_IMKEY,RT_WCKEY Item,RT_SEQNUM SeqNum,RT_OP_NUM OpNum,'_PRO' IconType FROM RT WHERE RT_IMKEY = '" & TreeNode.Text & "'" & _
  52.                "UNION " & _
  53.                "SELECT PS_IMKEY,PS_CPKEY Item,PS_SEQNUM SeqNum,PS_OP_NUM OpNum,'_MAT' IconType FROM PS WHERE PS_IMKEY = '" & TreeNode.Text & "' Order By OpNum"
  54.     NodeRec.Open NodeStr, TreeCon, adOpenStatic, adLockOptimistic, adCmdText
  55.    
  56.     If NodeRec.RecordCount = 0 Then 'Checks against database for Children
  57.         NodeRec.Close
  58.         Exit Sub ' If no Children, exit sub, continue walking tree
  59.     Else
  60.         NodeRec.MoveFirst
  61.         Do While Not NodeRec.EOF 'Adds nodes for current level
  62.             Set TreeNode1 = tvPS.Nodes.Add(TreeNode.Key, tvwChild, TreeNode.Text & "_" & NodeRec!Item & "_" & NodeRec!OpNum & NodeRec!IconType, NodeRec!Item)
  63.             NodeRec.MoveNext
  64.         Loop
  65.     End If
  66.     Set TreeNode = TreeNode1
  67.     Call Walk_Tree(TreeNode) 'Calls Recursively
  68. End Sub

The database Structure for this example is as follows:|

PS Table
------------
PS_SEQNUM = unique number
PS_OP_NUM = number
PS_IMKEY = Parent Node
PS_CPKEY = Child Node

(Example)
PS_IMKEY = Jeremy
PS_CPKEY = Josh

(Tree)
Jeremy
|_Josh

RT Table
-----------
RT_SEQNUM = unique number
RT_OP_NUM = number
RT_IMKEY = Parent Node
RT_WCKEY = Child Node

(Example)
PS_IMKEY = Jeremy
PS_CPKEY = Josh
RT_IMKEY = Jeremy
RT_WCKEY = Kick

(Tree)
Jeremy
|_Josh
|_Kick

Hope this all makes sense, Jeremy