Roz Clarke
roz.clarke at donnslaw.co.uk
Thu Feb 12 05:34:15 CST 2004
thanks Bryan. you're a star. -----Original Message----- From: Bryan Carbonnell [mailto:carbonnb at sympatico.ca] Sent: 12 February 2004 11:13 To: Access Developers discussion and problem solving Subject: Re: [AccessD] Recursive data in treeview control On 12 Feb 2004 at 10:40, Roz Clarke wrote: > Does anyone have any code for recursively populating a treeview > control? I have a table like this: > > TaskID ParentID Description > 1 0 fleg > 2 1 subfleg a > 3 1 subfleg b > 4 2 sub-subfleg a > > and so on. I don't want to limit the number of levels. > > I can see that I need to run through the dataset and populate the > treeview with the first level, then do it again n times until all the > children are added at the appropriate level, skipping any record > already added as a node. > > I'm in a hurry - I have 2 hours to nail this (working hours not > real-time) so although it feels lazy and I would love to crack this on > my own, if anyone has done it before I would appreciate any help you > can give. Roz, That is sort of the approach I too in my Treview Switchboard wizard. Here is the code I pulled out of it. If I missed any functions, you can download the wizard from: http://www3.sympatico.ca/carbonnb/bryan/Access/TreeViewSB.html -=-=-=-=Private Sub fFillTreeView() '--------------------------------------------------------------------- ----- '.Purpose : To (re)Fill the treeview with top level nodes '.Author : Bryan Carbonnell '.Date : 29-Nov-2002 '.Called by : Form_Open, tvw_NodeClick '.Calls : fFillChildren '.Revised : 29-Nov-2002 - Original '--------------------------------------------------------------------- ----- Const cstrProcName As String = "fFillTreeView" Dim strSQL As String Dim rst As DAO.Recordset Dim nd As Node 'Clear Treeview nodes tvw.Nodes.Clear 'Build SQL to get Enabled Root Level Items strSQL = "Select * FROM " & mstrTableName & _ " WHERE SwitchboardID=1" & _ " AND ItemNumber<>0" & _ " AND Enabled=True" & _ " ORDER BY ItemNumber" 'Open the Recordset Set rst = CurrentDb().OpenRecordset(strSQL) 'Loop Through and build the nodes Do While Not (rst.EOF) 'Create the Node Set nd = tvw.Nodes.Add(, , , rst!ItemText) 'Build Node Tag nd.Tag = "Command=" & rst!Command & ";Argument=" & rst!Argument 'nd.Tag = fBuildTag(rst) 'Check to see if we have an Open Switchboard Item If rst!Command = sbeOpenSwitchboard Then 'This is an Open SB so we need to fill the children sFillChildren nd End If 'Move to next record rst.MoveNext Loop 'Close and release rst.Close Set rst = Nothing End Sub Private Sub sFillChildren(nd As Node) '--------------------------------------------------------------------- ----- '.Purpose : To Fill any children nodes '.Author : Bryan Carbonnell '.Date : 29-Nov-2002 '.Called by : fFillTreeView, fFillChildren (recursive) '.Calls : '.Inputs : nd - Node - Parent node of these children '.Revised : 29-Nov-2002 - Original '--------------------------------------------------------------------- ----- Const cstrProcName As String = "sFillChildren" Dim aryPairs() As String Dim arySplit() As String Dim strSQL As String Dim lngArgument As Integer Dim lngLoop As Long Dim rst As DAO.Recordset Dim ndNew As Node 'Split tag into pairs aryPairs = Split(nd.Tag, ";") 'Loop through split to get SwitchboardID that this node ' opens, which is the Argument For lngLoop = LBound(aryPairs) To UBound(aryPairs) 'Now split each arySplit = Split(aryPairs(lngLoop), "=") If arySplit(0) = "Argument" Then 'Get the Argument Value, which is the SB to Open lngArgument = Val(arySplit(1)) Exit For End If Next 'Build SQL to select all the items in the Switchboard ' but not the 0 record, which is just info about the ' switchboard strSQL = "SELECT * FROM " & mstrTableName & _ " WHERE SwitchboardID=" & lngArgument & _ " AND ItemNumber<>0" & _ " AND Enabled=True" Set rst = CurrentDb.OpenRecordset(strSQL) 'Loop through reordset to add new tags Do While Not (rst.EOF) 'Add New Node Set ndNew = tvw.Nodes.Add(nd, tvwChild, , rst!ItemText) 'Build Node Tag ndNew.Tag = "Command=" & rst!Command & ";Argument=" & rst!Argument 'Check and see if we just added an Open Switchboard If rst!Command = sbeOpenSwitchboard Then 'We did, so add children sFillChildren ndNew End If 'Move to next record rst.MoveNext Loop End Sub This is probably one of the better commented chunck of code I have written :-)) -- Bryan Carbonnell - carbonnb at sympatico.ca Blessed are they who can laugh at themselves, for they shall never cease to be amused. _______________________________________________ AccessD mailing list AccessD at databaseadvisors.com http://databaseadvisors.com/mailman/listinfo/accessd Website: http://www.databaseadvisors.com