[asp] treeview

Pagina: 1
Acties:

  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
Ik wil in een lijst een aantal links wegschrijven op de parent / child manier,
maar ik snap het niet helemaal of helemaal niet ..
Ik heb nu 100en topics door zitten worstelen over treeviews enzo,
maar er gaat bij mij iets mis .. als ik de volgende sub gebruik:

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Set RecSet = Server.CreateObject("ADODB.Recordset")
    strSQL = "SELECT * FROM content"
    RecSet.Open strSQL, strConnect

Sub Kindjes(id)
  RecSet.Filter = "ParentId = " & id
     While Not RecSet.EOF
        Response.Write RecSet("NavTitleEn")
        Kindjes(RecSet("id"))
        RecSet.MoveNext
     Wend
End Sub

Kindjes(0)

    RecSet.Close
Set RecSet = Nothing


dan komt van de eerste parent het eerste child in het scherm,
vervolgens weer zijn child en dan weer zijn child net zo lang
tot er een child-zonder-child komt en dan volgt er een
error melding LOGISCH ..

maar na het lezen van al die topics en verhalen op
internet ben ik nog niet veel wijzer geworden;
meestal zie ik deze functie staan met daarin een parameter "level"
er bij. Maar ik snap niet helemaal hoe je die level parameter
moet gebruiken ..

ik dacht dus nadat het fout ging ..
je moet dus TESTEN of iets een child heeft .. zo niet dan moet je terug
naar de vorige parent Id en dan testen of die childs heeft zo niet weer
terug naar de vorige ..
maar ik raak dus echt in de knoop op die manier, ik bedoel je kan
niet alle parent id's op gaan slaan dat lijkt me zelfs onzinnig,

die anderen ..
die gebruiken dat dus ook niet maar die gebruiken LEVEL
maar level houd volgens mij weinig verband met parentID of ik
zie het niet en ik snap echt even niet hoe al die andere dudes dat nou oplossen

[ Voor 24% gewijzigd door intrix op 18-02-2004 11:23 ]

welcome my son, welcome to the machine


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 26-05 23:39

mulder

ik spuug op het trottoir

wat gaat er nu fout dan

oogjes open, snaveltjes dicht


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:24

gorgi_19

Kruimeltjes zijn weer op :9

Ik gok dat de childsubs de filter gaan wijzigen, waardoor je dus nooit verder kan gaan dan 1 tak en alleen naar beneden.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
gorgi_19 schreef op 18 februari 2004 @ 11:26:
[...]

Ik gok dat de childsubs de filter gaan wijzigen, waardoor je dus nooit verder kan gaan dan 1 tak en alleen naar beneden.
Eh.. ja inderdaad dat is precies wat er gebeurd .. logisch ook,
maar hoe los je dat anders op? Op de een of andere manier heb
ik een soort oogkleppen op en een boord voor me kop geloof ik ..

moet je dan soms met copieen gaan werken en die filteren ..
nee dat is ook niet goed dan krijg je een oneindig aantal nutteloze
copieen van de recset

De volgende code heb ik uit een ander treeview topicl

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<%
Sub display(bernr, level)
  if (level < 8) Then
    Response.Write "<UL>"
    Set RS = Server.CreateObject("ADODB.RecordSet")
    if bernr = 0 then Sorter = "DESC"
    if bernr <> 0 then Sorter = "ASC"
    SQL = "SELECT * FROM Message ORDER BY ID " & Sorter & ";"
    rs.Open SQL, Conn, 3, 3
    While Not rs.eof And level <>1
      Response.Write "<li><A HREf=""" & ScriptName &_
        "?ID=" & rs("ID") & """>" &_
        Left(rs("Subject"), 35) & "</a></li>" & VbCrLf
      Call Display(RS("ID") ,level + 1)            
      Rs.Movenext
      if Not RS.Eof And level = 1 Then Response.Write  VBCrLf
    Wend
    Rs.Close
    Set RS=Nothing
    Response.Write "</UL>"
  End if
End sub
%>


<% Call Display(0,1) %>


deze gozer werkt met levels ofzo .. maar ik zie het verband niet
helemaal die levels slaat ie die dan op in z'n database of iets?
dat doe ik dus niet zou dat moeten dan?

[ Voor 100% gewijzigd door intrix op 18-02-2004 11:34 ]

welcome my son, welcome to the machine


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 26-05 23:39

mulder

ik spuug op het trottoir

code:
1
2
3
4
5
6
7
8
9
10
11
    Private Function RenderLevel(pid, rst)
    Dim rstClone
    
        Set rstClone = rst.Clone()
        rst.Filter = "ParentID = " & pid
        Do While Not rst.EOF
            Call RenderLevel(rst.Fields("Id").Value, rstClone)  
            rst.MoveNext
        Loop    
        Set rstClone = Nothing
    End Function


Dit is ook een manier

oogjes open, snaveltjes dicht


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 22:24

gorgi_19

Kruimeltjes zijn weer op :9

Eh.. ja inderdaad dat is precies wat er gebeurd .. logisch ook,
maar hoe los je dat anders op?
Een filter maken op een recordset IN de functie, zodat de recordset geen scope heeft buiten de functie.

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
Don Facundo schreef op 18 februari 2004 @ 12:20:
code:
1
2
3
4
5
6
7
8
9
10
11
    Private Function RenderLevel(pid, rst)
    Dim rstClone
    
        Set rstClone = rst.Clone()
        rst.Filter = "ParentID = " & pid
        Do While Not rst.EOF
            Call RenderLevel(rst.Fields("Id").Value, rstClone)  
            rst.MoveNext
        Loop    
        Set rstClone = Nothing
    End Function


Dit is ook een manier
Dat clone() commando dat werkt niet echt hoor gloof ik

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Set RecSet = Server.CreateObject("ADODB.Recordset")
    strSQL = "SELECT * FROM content"
    RecSet.Open strSQL, strConnect

Sub Kindjes(id)
Dim rstClone
'hier onder is line 118
    Set rstClone = RecSet.Clone(1)
        rstClone.Filter = "ParentID = " & pid
        While Not rstClone.EOF
            Response.Write RecSet("NavTitleEn")
            Kindjes(rstClone("id"))
            rstClone.MoveNext
        Wend  
    Set rstClone = Nothing
End Sub

Kindjes(0)

    RecSet.Close
Set RecSet = Nothing


code:
1
2
3
4
5
ADODB.Recordset error '800a0cb3' 

Object or provider is not capable of performing requested operation. 

/default.asp, line 118



edit: probleem gevonden:
Make sure that you're using a static, dynamic, or keyset recordset before you attempt to clone the recordset

maar toch niet helemaal
code:
1
    RecSet.Open strSQL, strConnect, adOpenStatic, adLockOptimistic


geeft nog steeds de zelfde fout!

OORZAAK: server had geen toegang tot i&ascripts\adovbs.inc
Oplossing 3 invullen ipv adLockOptimistic ;)

[ Voor 41% gewijzigd door intrix op 18-02-2004 13:01 ]

welcome my son, welcome to the machine


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
mag ik vragen waarom je deze treeview opbouwt aan de hand van een recordset en niet aan de hand van een array waar je met een recursieve functie doorheen loopt

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 26-05 23:39

mulder

ik spuug op het trottoir

Mag ik dan vragen waarom jij dat vraagt? De tree word volgens mij adhv data uit de database opgebouwd, wil je die nog eerst naar een array van objecten mappen?

oogjes open, snaveltjes dicht


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
tuurlijk mag jij dat vragen ;)

- met een array werken gaat een stuk eenvoudiger
- je kunt je recordset al 100 keer hebben hergebruikt voordat je aan het gebruik van je array toekomt
- afaik is ado niet zo snel als een array...

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
Was mijn eerste ingeving,

zit net even op 4GuysFromRolla te kijken over performance,
daar zag ik dus ook in dat ik beter iets in een variabele kan knallen
dan 100 keer je db doorzoeken, dat wist ik wel maar was me er
tijdens het maken niet 100% bewust van :)

maar denk eens mee ..
op dit moment 'filter' ik de recset, helemaal dubbel vertragend
want wat je doet is het volgende: je gebruikt een vb opdracht die
de data door gaat zoeken, nou reken maar uit dat is langzaam!

beter zou nog zijn om elke keer een nieuwe SQL opdracht aan te
roepen ..

maar goed wat zou jij dan doen?

-Elke keer een Sql opdracht starten en die in een array kwakken (per aanroep)
-Een keer Sql opdracht aanroepen en in de functie dan telkens een copy maken
en vervolgens filteren ..
-Iets anders namelijk .. ;)

[ Voor 53% gewijzigd door intrix op 19-02-2004 10:24 ]

welcome my son, welcome to the machine


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
FvKnijff schreef op 18 februari 2004 @ 14:58:
mag ik vragen waarom je deze treeview opbouwt aan de hand van een recordset en niet aan de hand van een array waar je met een recursieve functie doorheen loopt
ander vraagje .. hoe kan je die array het beste opbouwen,
iets(0) = recset.("iets") lijkt me niet de juiste wijze?!

in dat geval krijg je te veel array's,
rij(0) en daar dan alles in gooien zoekt niet fijn

dus eh .. ?!

welcome my son, welcome to the machine


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 26-05 23:39

mulder

ik spuug op het trottoir

GetRows volgens mij, maar ik mijn twijfels of het echt prettig werkt met een array.

oogjes open, snaveltjes dicht


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
Don Facundo schreef op 19 februari 2004 @ 12:50:
GetRows volgens mij, maar ik mijn twijfels of het echt prettig werkt met een array.
Nee getrows dat wordt 'm niet ..

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
'nieuwe set aanmaken
Set RecSet = Server.CreateObject("ADODB.Recordset")
    strSQL = "SELECT * FROM content ORDER BY SValue DESC, NavTitleEn ASC"
    RecSet.Open strSQL, strConnect, 3

Sub Kindjes(id)
 Dim RecSetDup, volgend
 Dim level
 Set RecSetDup = RecSet.Clone()
     RecSetDup.Filter = "ParentID = " & id

If( Not RecSetDup.EOF ) Then
    Response.Write "<ul>"
    level = 1
End If
       While Not RecSetDup.EOF
%>
       <li class="listmenu0st0">
         <a href="default.asp?id=<%= RecSetDup("id") %>">
         [img]"http://www.huisstijl.tudelft.nl/web/gfx/list_drop_0.gif"[/img]<%= RecSetDup("NavTitleEn") %></a>
         <span><%= RecSetDup("NavTitleEn") %></span>
       </li>
<%
          volgend = RecSetDup("id")
          Kindjes(volgend)
          RecSetDup.MoveNext
       Wend  
If( level = 1 ) Then
    Response.Write "</ul>"
    level = 0
End If

 Set rstClone = Nothing
End Sub

Kindjes(0)

    RecSet.Close
Set RecSet = Nothing


Goed bovenstaand dus mijn huidige code .. de vraag:

Wie weet een goede performence boost
kom maar op met al die goeie ideeen

welcome my son, welcome to the machine


Verwijderd

intrix schreef op 18 februari 2004 @ 11:29:
[...]

deze gozer werkt met levels ofzo .. maar ik zie het verband niet
helemaal die levels slaat ie die dan op in z'n database of iets?
dat doe ik dus niet zou dat moeten dan?
Hoi, ik was de gozer die die code gebruikte.

Het level staat inderdaad in de DB

Ongeveer op deze manier..

1 ID AutoNumber
2 ThreadID >> ID orginele Onderwerp
3 PrevRef >> ID waarop gereageerd is
4 Msglevel >> Op welk niveau is gereageerd 0 is standaard, 1 is re1, 2 is re op re1 enz.

Succes!

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:51
Ik gebruik altijd arrays.
code:
1
2
3
4
5
6
7
8
9
strConn = "je connectstring"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open strConn
SET RS = Conn.Execute("SELECT bladiebla.......")
arrDeArray = RS.getrows
'Verbinding sluiten en leegmaken
Set RS = Nothing
Conn.Close
Set Conn = Nothing

Roomba E5 te koop


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
sig69 schreef op 19 februari 2004 @ 14:27:
Ik gebruik altijd arrays.
code:
1
2
3
4
5
6
7
8
9
strConn = "je connectstring"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open strConn
SET RS = Conn.Execute("SELECT bladiebla.......")
arrDeArray = RS.getrows
'Verbinding sluiten en leegmaken
Set RS = Nothing
Conn.Close
Set Conn = Nothing
en wat doe je dan vervolgens met die array?
Hoe staan de gegevens dan daarin?

krijg je dan dat elke Rij een rij van de tabel is? OF wat dan?

Ik bedoel je moet SQL = "select * where parent = id"
die gehele rij moet je afdrukken en vervolgens roep je de functie weer aan met
FUNCTIE( ID )

als dat in een array staat als volgt :

Rij(1) = 23 (id) 16 (parentid) blaaaat (titel) blaaaaaaaat schaaaat (msg)

en ik moet dan daar ID uit gaan vissen dat wordt een drama!
Of krijg ik een dubbele array terug zo van

Array(1)("ID")
Array(1)("ParentId")
et.

leg eens uit ..

welcome my son, welcome to the machine


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:51
als je een tabel hebt met:
idparenttext
10text
20text
31text
En je maakt een array van een SELECT * FROM.... query, dan ziet je array er zo uit:
idparenttext
rij110text
rij220text
rij331text
Met een beetje creatief loopen kom je dan een heel eind, en je hoeft maar 1 query uit te voeren.

Roomba E5 te koop


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
sig69 schreef op 19 februari 2004 @ 23:41:
als je een tabel hebt met:
idparenttext
10text
20text
31text
En je maakt een array van een SELECT * FROM.... query, dan ziet je array er zo uit:
idparenttext
rij110text
rij220text
rij331text
Met een beetje creatief loopen kom je dan een heel eind, en je hoeft maar 1 query uit te voeren.
dubbele array dus?

welcome my son, welcome to the machine


  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
heb zelf met levels gewerkt, dat werkt gewoon niet!, levert veel extra acties op voor niets... mieter nou maar gewoon de hele boel in een array en om je op weg te helpen

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
sqlquery = "SELECT * FROM tbl_foo ORDER BY foo"
objRS.Open sqlquery, Con, 3, 1
  If Not RSa.Eof Then arr_tree = objRS.GetRows()
objRS.Close

'// constanten benoemen, werkt op een later moment wel prettig
Const tree_ID = 0
Const tree_parentID = 1
Const tree_text = 2

'// je tree bouwen met als parentID 0 (neem aan dat je zgn "top" -items een 
parentID van 0 meegeeft (en anders is het wanneer je mijn voorbeeld overneemt 
tijd om daaraan te beginnen ;))
If IsArray(arr_tree) Then bouw_tree(0)

'// je functie
Function bouw_tree(parentID)
  dim X  '// het is van belang om een var te gebruiken die niet global is!
  
  For X = 0 To Ubound(arr_tree, 2)
    If arr_tree(tree_parentID, X) = parentID Then
      '// doe hier wat je weer wil geven
      
      bouw_menu(arr_tree(tree_ID, X))
    End If
  Next
End Function


heb de code niet getest, dus het kan zijn dat je op bepaalde plaatsen wat haakjes weg moet halen....

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • sig69
  • Registratie: Mei 2002
  • Laatst online: 22:51
dubbele array dus?
Twee-dimensionale array. In principe gewoon een tabel dus.

Roomba E5 te koop


  • intrix
  • Registratie: November 2002
  • Laatst online: 04-12-2023
FvKnijff schreef op 20 februari 2004 @ 10:49:
heb zelf met levels gewerkt, dat werkt gewoon niet!, levert veel extra acties op voor niets... mieter nou maar gewoon de hele boel in een array en om je op weg te helpen

...
de code zal ik nog eens doorkijken dat van die levels was ik zeker niet
van plan .. voorlopig draait het scriptje zoals ik volgens mij al gepost had
van de week ga ik kijken of ik er uit kom met die array's

Ik zie trouwens dat je het hele boompje wil gaan bouwen,
het enige wat ik hoef te doen is het <lu><li> gedoe
de campus heeft beslist dat de rest via een javascript werkt
dat op de tu-site zelf staat

[ Voor 82% gewijzigd door intrix op 20-02-2004 15:18 ]

welcome my son, welcome to the machine


Verwijderd

FvKnijff schreef op 20 februari 2004 @ 10:49:
heb zelf met levels gewerkt, dat werkt gewoon niet!, levert veel extra acties op voor niets... mieter nou maar gewoon de hele boel in een array en om je op weg te helpen
Levels kan juist heel handig zijn als je vanuit een bericht (of wat er dan ook achter hangt) wilt weten op welk niveau je in de tree zit....

En roepen dat werkt gewoon niet klopt niet want het werkt wel... Of het in elke situatie de beste oplossing is is een ander verhaal.

Zolang de performance goed genoeg is van een treeview werkt het goed genoeg.

  • faabman
  • Registratie: Januari 2001
  • Laatst online: 08-08-2024
Verwijderd schreef op 20 februari 2004 @ 17:39:
Levels kan juist heel handig zijn als je vanuit een bericht (of wat er dan ook achter hangt) wilt weten op welk niveau je in de tree zit....
en sla je dat dan op in je database??? lijkt me het onnodig opslaan van informatie die je aan de applicatiekant kunt bepalen (en dan alleen op die momenten dat je het nodig hebt)...
En roepen dat werkt gewoon niet klopt niet want het werkt wel... Of het in elke situatie de beste oplossing is is een ander verhaal.
oke, misschien een beetje teveel gegeneraliseerd :)

Op zoek naar een baan als Coldfusion webdeveloper? Mail me!


  • Blizard
  • Registratie: September 2001
  • Niet online
Is er dan geen manier dat je je tree kan opbouwen zonder recursieve functie en zodoende maar 1 keertje door je array/recordset moet wandelen ? Want als er +500 elementen in de tree moeten kan dit wel even duren met een recursie.

/offtopic : bestaat er een manier om "een treeview-node te deselecten" ? Zit namelijk zo dat je 1 keer op een node klikt, je nooit meer kan zeggen tegen de tree : "deselect nu alle nodes" of je moet met checkboxes gaan werken (of de tree opnieuw opbouwen, maar dit is niet echt performant .. :/)

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 27-05 11:53
Mocht het zo zijn, dat je MSSQL als database gebruikt, dan kan je dit heel mooi oplossen met een paar Stored Procedures + een paar temptables.
Hiermee kan je razendsnel een tree maken uit de temptables. De temptables moeten zichzelf wel leeggooien, als de structuur veranderd, maar dat is met een trigger heel makkelijk op te lossen. Aangezien MSSQL maar iets van 225 keer recursie aan kan, is recursie geen optie.

Het is wel wat veel werk, maar hier komt ie :)

TempTable code
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE TABLE [dbo].[NodeChilds] (
    [NodeID] [int] NOT NULL ,
    [ChildNodeID] [int] NOT NULL ,
    [ChildParentNodeID] [int] NULL ,
    [TreeLevel] [int] NOT NULL ,
    [Children] [int] NOT NULL 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[NodeParents] (
    [FromNodeID] [int] NOT NULL ,
    [ToNodeID] [int] NOT NULL ,
    [NodeID] [int] NULL ,
    [SortID] [int] NOT NULL 
) ON [PRIMARY]
GO


opvragen alle Node Childs (de tree dus)
SourcePawn:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CREATE PROCEDURE cu_Nodes_SelectAllChilds
(
    @FromNodeID int
    
)
AS

IF NOT EXISTS (SELECT NULL FROM NodeChilds WHERE NodeID = @FromNodeID)
    EXEC cu_Nodes_BuildChildTable @NodeID = @FromNodeID

SELECT     NodeChilds.ChildNodeID, NodeChilds.ChildParentNodeID, Nodes.ParentNodeID, Nodes.NodeName, 
                      FROM         Nodes INNER JOIN
                      NodeChilds ON Nodes.NodeID = NodeChilds.ChildNodeID
WHERE     (NodeChilds.NodeID = @FromNodeID)

GO


de SP cu_Nodes_BuildChildTable
SourcePawn:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
CREATE PROCEDURE cu_Nodes_BuildChildTable
(
    @NodeID int
)
AS

SET NOCOUNT ON

DECLARE @curNodeID int
DECLARE @curParentNodeID int
DECLARE @TreeLevel int
DECLARE @NodeCount int
DECLARE @NodeName varchar(50)

SET @NodeCount = 0

CREATE TABLE #stack (stkNodeID int, stkParentNodeID int, TreeLevel int)
DELETE FROM NodeChilds WHERE NodeID = @NodeID

--Insert the first record
INSERT NodeChilds
    SELECT @NodeID, NodeID, ParentNodeID, 1, @NodeCount
    FROM Nodes
    WHERE NodeID = @NodeID


INSERT #STACK
    SELECT NodeID, ParentNodeID, 1
    FROM Nodes
    WHERE ParentNodeID = @NodeID
    ORDER BY NodeID DESC
    
    SELECT @TreeLevel = 1
    
    WHILE @TreeLevel > 0
        BEGIN
            IF EXISTS (SELECT TOP 30000 * FROM #stack WHERE TreeLevel = @TreeLevel ORDER BY stkNodeID DESC)
                BEGIN
                    
                    SELECT @curNodeID = stkNodeID, @CurParentNodeID = stkParentNodeID
                    FROM #stack
                    WHERE TreeLevel = @TreeLevel
                    ORDER BY stkNodeID DESC
                    
                    INSERT NodeChilds VALUES(@NodeID, @curNodeID, @curParentNodeID, @TreeLevel, 0)
                    UPDATE NodeChilds SET Children = Children + 1 WHERE ChildNodeID = @curParentNodeID
                    
                    DELETE FROM #stack
                    WHERE TreeLevel = @TreeLevel
                    AND stkNodeID = @curNodeID
                    
                    INSERT #stack
                    SELECT NodeID, ParentNodeID, @TreeLevel+1
                    FROM Nodes
                    WHERE ParentNodeID = @curNodeID
                    ORDER BY NodeID DESC
                    
                    IF @@rowcount > 0
                        SELECT @TreeLevel = @TreeLevel+1
                    
                    SET @NodeCount = @NodeCount + 1
                END
            ELSE
                BEGIN
                    SELECT @TreeLevel = @TreeLevel-1
                END
        END
GO


Met de resultaten van bovenstaande code, kan je heel makkelijk de tree's in elkaar gooien.

[voorbeeld output]
d = new dTree('d','Images/');
d.add(1,-1,'Home','ManageWorkspace.aspx?NodeID=1','','ManageWorkspace');
d.add(6287,1,'Nieuws','ManageWorkspace.aspx?NodeID=6287','','ManageWorkspace');
d.add(6291,1,'Produkten','ManageWorkspace.aspx?NodeID=6291','','ManageWorkspace');
d.add(6292,1,'ADSL','ManageWorkspace.aspx?NodeID=6292','','ManageWorkspace');
d.add(6293,1,'Diensten','ManageWorkspace.aspx?NodeID=6293','','ManageWorkspace');
d.add(6294,1,'Contact','ManageWorkspace.aspx?NodeID=6294','','ManageWorkspace');
d.add(6394,1,'Control Panel','ControlPanel/CheckConfiguration.aspx','','ManageWorkspace','','icons/configurationfolder.gif');d.add(63941,6394,'Manage Users','UserActions/ManageAllUsers.aspx','Manage all users','ManageWorkspace','','icons/userfolder.gif');d.add(63942,6394,'Manage Roles','UserActions/ManageRoles.aspx','Manage Roles','ManageWorkspace','','icons/userfolder.gif');d.add(63943,6394,'Manage Images','ImageActions/Manage.aspx','Manage Images','ManageWorkspace','','icons/imgfolder.gif');d.draw();
[/code]


Veel plezier er mee ;)

Complete Tut komt nog op mijn website, maar daar ben ik nog druk mee bezig!

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 27-05 11:53
Blizard schreef op 21 februari 2004 @ 10:14:
Is er dan geen manier dat je je tree kan opbouwen zonder recursieve functie en zodoende maar 1 keertje door je array/recordset moet wandelen ? Want als er +500 elementen in de tree moeten kan dit wel even duren met een recursie.

/offtopic : bestaat er een manier om "een treeview-node te deselecten" ? Zit namelijk zo dat je 1 keer op een node klikt, je nooit meer kan zeggen tegen de tree : "deselect nu alle nodes" of je moet met checkboxes gaan werken (of de tree opnieuw opbouwen, maar dit is niet echt performant .. :/)
Zie voorgaande post. Deze gebruikt geen recursie. Je kan zelfs specificeren vanaf welke node hij moet gaan opbouwen. resultaten worden opgeslagen, en gebruikt..indien geen resultaten beschikbaar, maakt hij de complete structuur weer aan, en slaat deze zo op...
best schaalbaar dacht ik zo

  • Blizard
  • Registratie: September 2001
  • Niet online
PhoneTech schreef op 21 februari 2004 @ 12:18:
[...]
Zie voorgaande post. Deze gebruikt geen recursie. Je kan zelfs specificeren vanaf welke node hij moet gaan opbouwen. resultaten worden opgeslagen, en gebruikt..indien geen resultaten beschikbaar, maakt hij de complete structuur weer aan, en slaat deze zo op...
best schaalbaar dacht ik zo
Ziet er allemaal leuk uit, maar is verdomd veel werk om te implementeren ! ... Is er al meer info over je tUt ? ;)

  • PhoneTech
  • Registratie: Mei 2000
  • Laatst online: 27-05 11:53
Helaas ben ik de komende dagen niet mentaal in staat om hier aan verder te werken. Dit komt doordat ik beneden de rivieren woon, en graag van tradities hou...De implementatie is niet zo moeilijk. De resultaten die je terug krijgt, zijn makkelijk te gebruiken. Mijn laatste implementatie is in .NET en daar voor heb ik deze code gebruikt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
for(int i = 0; i < dt.Rows.Count; i++)
                {
                    if(LastNode < (int)dt.Rows[i]["ChildNodeID"])
                        LastNode = (int)dt.Rows[i]["ChildNodeID"];
                
                    s.Append("d.add("); // Create new tree item
                    s.Append(dt.Rows[i]["ChildNodeID"].ToString()); //TreeItemID
                    s.Append(",");
                    if(FirstTreeItem)
                        s.Append(-1); //ParentTreeItemID
                    else
                        s.Append(dt.Rows[i]["ChildParentNodeID"].ToString()); //ParentTreeItemID
                    s.Append(",'");
                    s.Append(dt.Rows[i]["NodeName"].ToString()); //TreeItemName
                    s.Append("','");
                    s.Append("ManageWorkspace.aspx?NodeID="); //TreeItemUrl
                    s.Append(dt.Rows[i]["ChildNodeID"].ToString()); //TreeItemUrl
                    s.Append("','");
                    //s.Append(dt.Rows[i]["NodeDesc"].ToString()); //TreeItemDescription                
                    s.Append("','");
                    s.Append(Target); //TreeItemUrlTarget
                    //s.Append("','");
                    //s.Append(NodeOpen.ToString()); //TreeItem Opens at
                    s.Append("'); \n");
                    FirstTreeItem = false;
                }


Met zo een stringbuilder geval
Pagina: 1