Avatar billede puppetmaster Nybegynder
01. marts 2005 - 15:02 Der er 20 kommentarer og
1 løsning

Flytte elementer i listeboks

Er løbet ind i en listeboks begrænsning:
Mit program overfører værdier fra en listeboks til en anden når brugeren klikker på en knap og opbygger på baggrund af listen en SQL forespørgsel; ingen problemer i det, men nu bliver man jo grådig og vil have mere! :)
Jeg kunne godt tænke mig at brugeren fik et par knapper ved siden af listeboksen, så det var muligt at rykke rundt på elementerne, så hvis man f.eks. havde opbygget liste 2 til at se sådan her ud:
Postnr & By
Efternavn
Adresse
Fornavn
Land

Kunne få den til at se sådan her ud, i stedet for at skulle klikke dem alle tilbage i liste1 og tilføje dem igen:
Fornavn
Efternavn
Adresse
Postnr & By
Land

SQL forespørgslen henter nemlig værdierne over i Excel i kolonner, præcis i den rækkefølge de står i listeboksen. Jeg har kigger lidt på UpDown kontrollen, men den er vist gået itu eller noget... :(
Avatar billede mugs Novice
01. marts 2005 - 15:05 #1
Hvis du overfører data fra en forespørgsel, kan du kode dig ud af hvor data bliver placeret i Excel. Er det en mulighed kan jeg sende dig et eksempel når jeg kommmer hjem.
Avatar billede puppetmaster Nybegynder
01. marts 2005 - 15:06 #2
Hmmm...jeg ville nu hellere have et par knapper som kunne flytte det markerede element en plads op eller ned på listen.
Avatar billede puppetmaster Nybegynder
01. marts 2005 - 15:08 #3
mugs: Bruger p.t. denne kode(stump) til at overføre til Excel:

  While Not rst.EOF
    J = J + 1
    For i = 0 To Liste2.ListCount - 1
      xlsheet.Cells(J, i + 1) = rst.Fields(Liste2.Column(0, i))
      If Liste2.Column(0, i) = "Dato" Or Liste2.Column(0, i) = "Afsendelsesdato" Or Liste2.Column(0, i) = "Oplastningsdato" Or Liste2.Column(0, i) = "Bestillingsdato1" Or Liste2.Column(0, i) = "Bestillingsdato2" Or Liste2.Column(0, i) = "Bestillingsdato3" Or Liste2.Column(0, i) = "Ændringsdato" Or Liste2.Column(0, i) = "Oprettelsesdato" Then
        xlsheet.Cells(J, i + 1).Select
        xlapp.Selection.NumberFormat = "m/d/yyyy"
      End If
    Next
    rst.MoveNext
  Wend
Avatar billede terry Ekspert
01. marts 2005 - 15:14 #4
Avatar billede terry Ekspert
01. marts 2005 - 15:18 #5
Sorry, dont think that link gives you what you want.
Avatar billede puppetmaster Nybegynder
01. marts 2005 - 15:20 #6
Judging by the name of the link, I guess not, terry, but I will take a look anyway...
Avatar billede puppetmaster Nybegynder
01. marts 2005 - 15:22 #7
Nope...
Avatar billede puppetmaster Nybegynder
01. marts 2005 - 15:43 #8
So, what I need to do....is....get the listbox's recordsource and put it in a 2D array, then find what place in the array the selected item is in and move it 1 place up/down in the array, while the item in that place needs to be moved 1 place down/up.
Avatar billede nih Novice
01. marts 2005 - 20:17 #9
på en form med en liste: liste0 - og en knap med følgende kode:
listen har rækkekilden angivet til 'værdiliste' og 'antal kolloner' = 1

Private Sub Kommandoknap2_Click()

    Dim lstArray
    Dim i
    Dim nyrecSource
    lstArray = Split(Liste0.RowSource, ";")
   
    If Liste0.ListIndex = 0 Then Exit Sub

    lstArray(Liste0.ListIndex - 1) = Liste0.Column(0, Liste0.ListIndex)
    lstArray(Liste0.ListIndex) = Liste0.Column(0, Liste0.ListIndex - 1)
 
    For i = 0 To UBound(lstArray)
        nyrecSource = nyrecSource & ";" & lstArray(i)
    Next i
    nyrecSource = Right(nyrecSource, Len(nyrecSource) - 1)
   
    Liste0.RowSource = nyrecSource
    Liste0.Requery
   
End Sub
Avatar billede nih Novice
01. marts 2005 - 20:38 #10
og her kører vi den anden vej :o)

Private Sub Kommandoknap3_Click()
    Dim lstArray
    Dim i
    Dim nyrecSource
    lstArray = Split(Liste0.RowSource, ";")
   
    If Liste0.ListIndex < 0 Then Exit Sub
    If Liste0.ListIndex = UBound(lstArray) Then Exit Sub
   
    lstArray(Liste0.ListIndex + 1) = Liste0.Column(0, Liste0.ListIndex)
    lstArray(Liste0.ListIndex) = Liste0.Column(0, Liste0.ListIndex + 1)
   
    For i = 0 To UBound(lstArray)
        nyrecSource = nyrecSource & ";" & lstArray(i)
    Next i
   
    nyrecSource = Right(nyrecSource, Len(nyrecSource) - 1)
   
    Liste0.RowSource = nyrecSource
    Liste0.Requery
End Sub
Avatar billede puppetmaster Nybegynder
02. marts 2005 - 10:50 #11
Kanon, nih, bortset fra én ting:
Første gang man klikker på Op/Ned knapperne, går det godt, men så fjernes fokus fra det valgte element og hvis man ikke vælger et eller andet element, så går programmet i fejl.
Avatar billede puppetmaster Nybegynder
02. marts 2005 - 10:57 #12
Når jeg har overført de ønskede elementer fra liste1 til liste2 og klikker på Op eller Ned knappen, går det fint, men så fjernes markeringen fra det valgte element.
Hvis jeg derimod, efter at liste2 er fyldt ud, VÆLGER et af elementerne på listen, så går det fint HELE tiden!
Det er som om Access markerer det sidste overførte element, men "glemmer" markeringen, når der trykkes på Op/Ned (undtagen hvis man BEVIST vælger et af elementerne)
Avatar billede nih Novice
02. marts 2005 - 11:05 #13
Du er da nødt til at vælge et element inden du trykker på knappen, ellers ved hverken acces eller jeg hvilket elemnt du vil flytte op/ned.
Avatar billede puppetmaster Nybegynder
02. marts 2005 - 11:06 #14
Det er jo sagen, Access markerer automatisk det sidst overførte element....
Avatar billede nih Novice
02. marts 2005 - 11:06 #15
du kan sætte Access til default at vælge et element når formen åbnes - var det en løsning ???
Avatar billede puppetmaster Nybegynder
02. marts 2005 - 11:08 #16
Hmmmm.....ikke rigtigt, for så er der ingen elementer i liste2, kun i liste1 og som sagt, så overfører brugeren elementer fra liste1 til liste2 og SÅ klikker på Op eller Ned knapperne.
Avatar billede nih Novice
02. marts 2005 - 11:09 #17
Hvordan ser den kode ud du bruger når du overfører et element fra en liste til en anden - Og hvilket element vil du have valgt
Avatar billede puppetmaster Nybegynder
02. marts 2005 - 11:09 #18
Private Sub En_over_knap_Click()
  Dim i As Integer, markeret As Integer
  Dim ny_liste As String
 
  If Liste1.ItemsSelected.Count > 0 Then
    For i = 0 To Liste1.ListCount - 1
      If Liste1.Selected(i) Then
        If Liste2.ListCount > 0 Then
          Liste2.RowSource = Liste2.RowSource & ";"
        End If
        Liste2.RowSource = Liste2.RowSource & Liste1.Column(0, i)
        markeret = i
      Else
        ny_liste = ny_liste & Liste1.Column(0, i) & ";"
      End If
    Next
   
    If Len(ny_liste) > 0 Then
      Liste1.RowSource = Mid(ny_liste, 1, Len(ny_liste) - 1)
    Else
      Liste1.RowSource = ""
    End If
   
    Liste2.Selected(Liste2.ListCount - 1) = True
   
    If markeret > Liste1.ListCount - 1 Then
      Liste1.Selected(Liste1.ListCount - 1) = True
    Else
      Liste1.Selected(markeret) = True
    End If
  End If
End Sub
Avatar billede puppetmaster Nybegynder
02. marts 2005 - 11:11 #19
Fjerner bare disse kodelinier:

    Liste2.Selected(Liste2.ListCount - 1) = True

    If markeret > Liste1.ListCount - 1 Then
      Liste1.Selected(Liste1.ListCount - 1) = True
    Else
      Liste1.Selected(markeret) = True
    End If
Avatar billede puppetmaster Nybegynder
02. marts 2005 - 11:12 #20
Så er der ingen der er "markeret" og brugeren skal aktivt vælge et element.
Drop et svar, nih, du skal da have point for din løsning.
Avatar billede nih Novice
02. marts 2005 - 11:20 #21
svar :)
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