Business partners:

Aventeon

 

Intermec 

  

Welnet 

 

 Motorola Solutions

 

 Preferred Supplier van:

 Mediq-Logistiek

 

Reseller van:

Logistics.One

 

  SOTI

 

 

 

 

Leerbedrijf

 

Blogs

dec 16

Written by: Gert van Oel
16-12-2010 9:24 

Binnen een Access formulier kan je een zogenaamd Treeview object plaatsen uit de MSComctl library (MSComctlLib.TreeCtrl.2). Ik gebruik deze control al jaren en het is een mooie tool om gegevens grafisch te presenteren.

Gisteren moest ik een Treeview vullen met +/- 1500 records en de control werd onhandelbaar langzaam. Het legen en weer vullen kostte meer dan 15 seconden. Met wat hulp van het internet heb ik dit terug kunnen brengen tot minder dan een seconde.
Traditioneel en volgens diverse tutorials wordt een Treeview gevuld door bijvoorbeeld door een recordset te lopen en per record een zogenaamde node aan de Treeview control toe te voegen.

Stel op het formulier bestaat het Treeview control met de naam "Treeview1"
Dim RS as New ADODB.RecordSet
RS.Open "SELECT klantnr, naam FROM Klanten", CurrentProject.Connection
Do Until RS.EOF
    Me.Treeview1.Nodes.Add ,,RS("klantnr"),RS("naam")
    RS.MoveNext
Loop
RS.Close
 
Voordat je een Treeview kunt vullen moet je 'm uiteraard eerst legen en dat doe je normaal gesproken met de opdracht Me.Treeview1.Nodes.Clear
Zoals gezegd duurde dit nogal lang en de oplossing zit 'm in twee zaken. Voor het legen kan je beter door de nodes heen lopen en de verwijderen (remove) in plaats van schonen (clear) en verder is de manier van aanroepen en het door de nodes heen lopen van belang. Onderstaande code verwijderd eerst alle bestaande nodes en vult daarna meer dan 1500 records in de Treeview binnen een seconde.
 
'Legen
 clearTree Me.TreeView1
 
'Vullen
Dim RS as New ADODB.RecordSet
RS.Open "SELECT klantnr, naam FROM Klanten", CurrentProject.Connection
With Me.Treeview1.Nodes
    Do Until RS.EOF
        .Add ,,RS("klantnr"),RS("naam")
        RS.MoveNext
    Loop
End With
RS.Close
 
Private Sub clearTree(obj As Object)
    Dim x As Integer
    With obj
        Me.Painting = False
        For x = .Nodes.Count To 1 Step -1
            .Nodes.Remove x
        Next x
        Me.Painting = True
    End With
End Sub
 
 
Of het wel zo verstandig is om 1500 records te tonen in een Treeview control is uiteraard een heel andere discussie :)
 
Verder nog een tip: Om een of andere belachelijke reden accepteert het control als unieke sleutel geen waarde die begint met een getal. Als zoals in dit voorbeeld het klantnr uit een numerieke waarde bestaat moet je het converteren naar een string en er een letter voorzetten StrConv("k" & RS("klantnr"), vbLowerCase). Als de later op basis van de nodeKey je klantnr weer wilt hebben moet je die "k" er weer afhalen.
 

Tags:

VOICT B.V. en VOICT Services B.V. - Keesomstraat 31 - 6717AH Ede - T: 0318 642413 - E: info@voict.nl