Avatar billede al_pacone Nybegynder
20. oktober 2005 - 04:21 Der er 7 kommentarer og
1 løsning

Sorterer listbox

Kan man sorterer indholdet af en listbox, efter indholdet er puttet ind i listboxen?
Avatar billede jesperfjoelner Nybegynder
20. oktober 2005 - 07:47 #1
Man vil nok opdatere og sortere kilden til listboxen og så genfylde den.
Hvis den er baseret på en tabel kan man sortere SQL'en inden du fylder listboxen.
Hvis listboxen er baseret på en Værdiliste kan kommer det lidt an på, hvor værdierne kommer fra. Hvis de er helt tilfældige/beregnede eller andet, som ikke let kan genskabes et sted fra kan du evt. overføre værdierne til et array > sortere array'et og genfylde listboxen.
Avatar billede Slettet bruger
20. oktober 2005 - 07:50 #2
Sådan som du stiller spørgsmålet vil jeg umiddelbart sige nej, men sorteringen ligger jo på listboxens forespørgsel. Derfor skal sorteringen foregå i forespørgslen og hvis du på en eller anden måde indsætter eller skriver i listboxen, så må du lave en Me.Listbox.Requery på AfterUpdate hændelsen, før denne sortering træder i kraft!~)
Avatar billede Slettet bruger
20. oktober 2005 - 07:52 #3
Det er irriterende at der ikke er en autoupdate på siden, men det kan man måske ikke rigtigt i praksis...
Avatar billede Slettet bruger
20. oktober 2005 - 07:52 #4
Altså her på eksperten!~)
Avatar billede al_pacone Nybegynder
20. oktober 2005 - 07:54 #5
Listboxen er baseret på en værdiliste med tilfældige data.

Hvordan overfører jeg data til et array, og tilbage igen.
Avatar billede jesperfjoelner Nybegynder
20. oktober 2005 - 15:44 #6
Ok, så prøver jeg med dette. Du kan sortere et array med en "Bubblesort"-funktion.
Den kommer her og skal klippes ind i et standardmodul i databasen.

Function BubbleSort(ToSort As Variant, Optional SortAscending As Boolean = True) As Variant
    Dim AnyChanges As Boolean
    Dim l As Long
    Dim SwapFH As Variant
    Do
        AnyChanges = False
        For l = LBound(ToSort) To UBound(ToSort) - 1
            If (ToSort(l) > ToSort(l + 1) And SortAscending) _
              Or (ToSort(l) < ToSort(l + 1) And Not SortAscending) Then
                ' These two need to be swapped
                SwapFH = ToSort(l)
                ToSort(l) = ToSort(l + 1)
                ToSort(l + 1) = SwapFH
                AnyChanges = True
            End If
        Next l
    Loop Until Not AnyChanges
End Function


For at lægge en sorteret list ind som kildeliste til din listbox kan du bruge dette.
Jeg har lavet et eksempel med et array med 7 elementer, men du skal først indsamle listen fra din listbox.

Function SorterListBox()
Dim i As Integer
Dim sListe As String
Dim arr(6) As Variant
arr(0) = 2
arr(1) = 6
arr(2) = 8
arr(3) = 9
arr(4) = 1
arr(5) = 3
arr(6) = 4
'nu er arrayet lavet, så skal det sorteres
BubbleSort arr, True

'Lav array om til liste og sæt i listbox
For i = LBound(arr) To UBound(arr)
    sListe = sListe & arr(i) & ";"
Next
Forms!form1!list0.RowSource = sListe
End Function
Avatar billede al_pacone Nybegynder
20. oktober 2005 - 16:20 #7
Hej Jesper.
Ser fint ud dit forslag.
Desværre får jeg ikke tid til at kigge på det før mandag.
Avatar billede al_pacone Nybegynder
25. oktober 2005 - 12:46 #8
Hej Jesper.

Så er jeg tilbage på pinden.

Jeg er nået frem til følgende løsning.

Først putter jeg alle mine data direkte ind i et dynamisk array i 2 dimensioner.
Sorterer mit array med følgende kode.

Private Sub BubbleSort(ToSort As Variant, Optional SortAscending As Boolean = True)
  Dim AnyChanges As Boolean
  Dim l As Long
  Dim SwapFH0 As Variant
  Dim SwapFH1 As Variant
  Dim SwapFH2 As Variant
  Dim SwapFH3 As Variant
  Dim SwapFH4 As Variant
  Dim SwapFH5 As Variant
  Do
    AnyChanges = False
    For l = 0 To pCount - 1
      If (ToSort(2, l) > ToSort(2, l + 1) And SortAscending) Or _
        (ToSort(2, l) < ToSort(2, l + 1) And Not SortAscending) Then
          ' These two need to be swapped
          SwapFH0 = ToSort(0, l)
          SwapFH1 = ToSort(1, l)
          SwapFH2 = ToSort(2, l)
          SwapFH3 = ToSort(3, l)
          SwapFH4 = ToSort(4, l)
          SwapFH5 = ToSort(5, l)
          ToSort(0, l) = ToSort(0, l + 1)
          ToSort(1, l) = ToSort(1, l + 1)
          ToSort(2, l) = ToSort(2, l + 1)
          ToSort(3, l) = ToSort(3, l + 1)
          ToSort(4, l) = ToSort(4, l + 1)
          ToSort(5, l) = ToSort(5, l + 1)
          ToSort(0, l + 1) = SwapFH0
          ToSort(1, l + 1) = SwapFH1
          ToSort(2, l + 1) = SwapFH2
          ToSort(3, l + 1) = SwapFH3
          ToSort(4, l + 1) = SwapFH4
          ToSort(5, l + 1) = SwapFH5
          AnyChanges = True
      End If
    Next l
  Loop Until Not AnyChanges
End Sub

pCount er en global variabel med størrelsen af arrayet.
Så bliver det hele flyttet fra arrayet til listen med følgende kode.

For i = 0 To pCount - 1
  Me.lstRekorder.AddItem Item:=pArray(0, i) & ";" & pArray(1, i) & ";" & _
                              pArray(2, i) & ";" & pArray(2, i) & ";" & _
                              pArray(4, i) & ";" & pArray(5, i)
Next

Sikkert ikke den mest elegante løsning, men det virker.
Tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester