Toon posts:

[VB.NET] Treeview & Items Verwijderen

Pagina: 1
Acties:

Verwijderd

Topicstarter
In mijn programma wat ik aan het schrijven ben, heb ik menus gebouwd dmv een treeview.
Die menus zien er als volgt uit:

code:
1
2
3
4
5
6
7
8
Producten
\
 ---Windows-lijn
   \
    --- Windows 2000
 ---Linux-lijn
   \
    --- Redhat


Nu heb ik een knop in me project toegevoegt welke de items weer moet verwijderen welke hij eerder heeft aangemaakt.
Stel: als ik "Windows-lijn" aanklik, en druk dan op verwijderen, plaatst hij de items netjes in de array, en daarna verwijder ik ze uit de database.
Echter nu is het probleem, als ik producten aanklik en dan naar verwijder ga, dan plaatst hij producten in de array, en windows-lijn, niet windows 2000, wel linux-lijn, geen redhat.
Oftewel hij gaat maar tot 1 laag diep, hij geeft dan met deze code een exception, omdat hij in dit geval 5 telt, en maar 3 items "ziet".

Ik doe dit met de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim tvcount, tvaantal As Integer
Dim i As Integer
Dim blaatva2(100) As String

tvaantal = tvCBbestandsoverzicht.SelectedNode.GetNodeCount(True)

For i = 0 To tvaantal - 1
   blaatva2(tvcount) = tvCBbestandsoverzicht.SelectedNode.Nodes.Item(tvcount).Text
     If Not tvcount = tvaantal Then
       tvcount = tvcount + 1
     End If
Next

blaatva2(tvaantal) = tvCBbestandsoverzicht.SelectedNode.Text


Heeft iemand een idee hoe ik dit op kan lossen ?

Let niet op de variabelnamen, die zijn ff snel getypt om te testen.
Uiteindelijk wijzig ik die (natuurlijk) ;)

[ Voor 7% gewijzigd door Verwijderd op 13-10-2004 13:57 . Reden: aanpassingen :) ]


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:56

mulder

ik spuug op het trottoir

Je moet eerst de children verwijderen (evt de children van de children) met een recursieve functie.
code:
1
2
3
4
functie deleteNode(node)
  for each child
    deleteNode(childNode)
  delete node

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Klopt, dit was ook de bedoeling, echter het is meer hoe ik dus die onderliggende dingen uberhaupt in de array zet.
Het verwijderen van die items opzich wanneer ze in die array staan is kinderspel.

Dus eigelijk wat ik probeer is dus als volgt:
Als ik klik, is het de bedoeling dat hij dus alle items in die "treeview" lees alle childs[incl childs van childs] overneemt en plaatst in die array (of collection).

[ Voor 7% gewijzigd door Verwijderd op 13-10-2004 14:13 ]


  • Remco
  • Registratie: Januari 2001
  • Laatst online: 19-05 17:38
Hier een stukje code waar ik afgelopen week mee bezig ben geweest.
Het is ook een recursive methode
Misschien heb je er wat aan.
Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub getvalues(ByVal nodes As Infragistics.Win.UltraWinTree.TreeNodesCollection)
        'recursive routine om de geselecteerde nodes te krijgen.

        Dim i, count As Integer
        Dim node1 As Infragistics.Win.UltraWinTree.UltraTreeNode
        count = nodes.Count
        For i = 0 To (count - 1)
            node1 = nodes(i)
            If node1.CheckedState = CheckState.Checked Then
              Debug.Write((Microsoft.VisualBasic.Left(path, (Len(path) - 1))) & node1.FullPath.ToString)
            End If
            If Not node1.Nodes.Count = 0 Then
                getvalues(node1.Nodes)
            End If
        Next i
    End Sub

[ Voor 4% gewijzigd door Remco op 13-10-2004 14:19 ]

The best thing about UDP jokes is that I don't care if you get them or not.


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Verwijderd schreef op 13 oktober 2004 @ 13:56:
[...]

Ik doe dit met de volgende code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Dim tvcount, tvaantal As Integer
Dim i As Integer
Dim blaatva2(100) As String

tvaantal = tvCBbestandsoverzicht.SelectedNode.GetNodeCount(True)

For i = 0 To tvaantal - 1
   blaatva2(tvcount) = tvCBbestandsoverzicht.SelectedNode.Nodes.Item(tvcount).Text
     If Not tvcount = tvaantal Then
       tvcount = tvcount + 1
     End If
Next

blaatva2(tvaantal) = tvCBbestandsoverzicht.SelectedNode.Text


[...]
Op zich logisch datie maar tot 1 niveau diep gaat. Zo heb je het geprogrammeerd!
Je gaat de lijst af, en vraagt alle nodes van de geselecteerde node (SelectedNode.Nodes), maar je vergeet dat al die Nodes ook weer een property Nodes hebben, etc.

Maar in weze staat dat al in Remc0's code.

Het beste is dus de lijst van SelectedNode.Nodes aflopen en een recursieve functie aanroepen (en een arraylist meegeven). Die functie voegt de Node toe en loopt weer de lijst Nodes af en roept de recursieve functie weer aan..

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Verwijderd

Topicstarter
Heb nu gekeken naar die code van Remc0, maar de code die ik heb geschreven blijft loopen. Ik zie de fout maar niet :S

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    Sub getvalues()
        'recursive routine om de geselecteerde nodes te krijgen.

        Dim i, count As Integer
        Dim nodes, node1 As TreeNodeCollection

        nodes = tvCBbestandsoverzicht.SelectedNode.Nodes
        node1 = nodes
        Dim blaatva2(100) As String

        '    Dim node1 As Windows.Forms.TreeNode
        count = nodes.Count
        For i = 0 To (count - 1)
            If Not node1.Count = 0 Then
                getvalues()
            End If
        Next i
    End Sub

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ja omdat nodes = tvCBbestandsoverzicht.SelectedNode.Nodes altijd hetzelfde is. Je moet wel aangeven bij de volgende call dat er vanaf een andere node gestart wordt. Je zult dus een parameter mee moeten geven aan getvalues()

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Verwijderd schreef op 13 oktober 2004 @ 15:02:
Heb nu gekeken naar die code van Remc0, maar de code die ik heb geschreven blijft loopen. Ik zie de fout maar niet :S

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    Sub getvalues()
        'recursive routine om de geselecteerde nodes te krijgen.

        Dim i, count As Integer
        Dim nodes, node1 As TreeNodeCollection

        nodes = tvCBbestandsoverzicht.SelectedNode.Nodes
        node1 = nodes
        Dim blaatva2(100) As String

        '    Dim node1 As Windows.Forms.TreeNode
        count = nodes.Count
        For i = 0 To (count - 1)
            If Not node1.Count = 0 Then
                getvalues()
            End If
        Next i
    End Sub
Zoals rwb zegt.
De Sub header moet zoiets worden:
code:
1
Public Sub GetValues(ByVal N As TreeNode, ByRef V As ArrayList)

Vervolgens voeg je N.Text toe aan V.
Dan kijk je of er nog meer nodes in N zitten en roep je GetValues weer aan, maar
dan met N.Nodes, maar wel met dezelfde V.
code:
1
GetValues(N.Nodes, V)

[ Voor 3% gewijzigd door MrSleeves op 13-10-2004 15:52 ]

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Verwijderd

Topicstarter
Mensen ik kom er maar niet uit, en het probleem is nu dat ik niet meer weet waar ik moet kijken.
Ik probeer de code die Remc0 heeft geschreven te bekijken en wat mee te doen, maar ik ben momenteel vrij inspiratieloos. Waarom ? Ik heb geen idee.
Wat ik iig wel weet, is dat ik maar geen programmeur moet worden.

Normaal gesproken lukt het altijd wel weer, los ik het probleem op en kan ik weer verder. Ik ben nu al ruim 2 volle dagen bezig om zo'n klein stukje code uit te poepen, en ik "snap" schijnbaar gewoon niet genoeg hoe zo'n treeview werkt.

[ Voor 28% gewijzigd door Verwijderd op 13-10-2004 16:50 ]


  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Verwijderd schreef op 13 oktober 2004 @ 16:47:
Mensen ik kom er maar niet uit, en het probleem is nu dat ik niet meer weet waar ik moet kijken.
Ik probeer de code die Remc0 heeft geschreven te bekijken en wat mee te doen, maar ik ben momenteel vrij inspiratieloos. Waarom ? Ik heb geen idee.
Wat ik iig wel weet, is dat ik maar geen programmeur moet worden.
Ik zal je matsen:
code:
1
2
3
4
5
6
7
    Public Sub GetValues(ByVal N As TreeNode, ByRef V As ArrayList)
        V.Add(N.Text)

        For Each tn As TreeNode In N.Nodes
            GetValues(tn, V)
        Next
    End Sub


Nu moet je er toch wel uitkomen?

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Verwijderd

Topicstarter
Mjah, maar meer hoe krijg ik mijn geselecteerde treeview in die array. En voornamelijk hoe roep ik die functie aan.
Dat is voornamelijk waar ik niet uitkom, die code is simpel, kort, en dat is een van de dingen die ik nodig had, in ieder geval dank daarvoor.

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Verwijderd schreef op 13 oktober 2004 @ 16:56:
Mjah, maar meer hoe krijg ik mijn geselecteerde treeview in die array. En voornamelijk hoe roep ik die functie aan.
Dat is voornamelijk waar ik niet uitkom, die code is simpel, kort, en dat is een van de dingen die ik nodig had, in ieder geval dank daarvoor.
Euhm, hoe roep je die aan?
code:
1
2
   Dim selectedValues As New ArrayList
   GetValues(tvCBbestandsoverzicht.SelectedNode, selectedValues)


Nu staan al je geselecteerde nodes in de ArrayList :?

30Drie Web Design & IT Consultancy | Raven Consultancy Services


Verwijderd

Topicstarter
Perfect, dit was dus exact wat ik werkte, en dat recursive is veel korter dan ik dacht...
In ieder geval bedankt met het helpen !!!

  • MrSleeves
  • Registratie: Februari 2004
  • Laatst online: 10-04 19:23

MrSleeves

You'll thank me later.

Verwijderd schreef op 14 oktober 2004 @ 09:41:
Perfect, dit was dus exact wat ik werkte, en dat recursive is veel korter dan ik dacht...
In ieder geval bedankt met het helpen !!!
Recursie lijkt moeilijk omdat functies zichzelf aan gaan roepen, maar eigenlijk worden dingen eerder eenvoudiger. Je moet alleen zorgen dat je het later ook nog snapt (in dit geval zal daar geen sprake van zijn).

Meestal wordt recursie alleen niet als efficiënt gezien, maargoed ik ben lui en ik zie minder regels code als efficiënt :7 .

Als je het nog iets netter wilt doen, dan kan je ook de route meegeven aan de functie. Dan geef je een string mee die begint met niks en elke keer uitgebreid wordt met tn.Text+"\". Die string gebruik je dan als prefix van T.Text. Zo weet je zeker dat iedere entry uniek is.

30Drie Web Design & IT Consultancy | Raven Consultancy Services

Pagina: 1