[access/vba] focus vast bij listbox.selected=true

Pagina: 1
Acties:
  • 232 views sinds 30-01-2008
  • Reageer

  • Stefke
  • Registratie: December 2000
  • Laatst online: 20-08 12:02
Ik heb een vaag probleem in Access, lees aub goed door, heb zo goed mogelijk proberen te omschrijven:

Ik heb een scherm, met daarop een zoekveld en een keuzelijst (listbox). In de keuzelijst - daarin worden de records weergegeven - kunnen gebruikers uit de records kiezen door de juiste regel te selecteren (klikken), in het scherm wordt dan de bijbehorende record weergegeven.
In het zoekveld kunnen gebruikers het persoonsnummer ingeven, na ingave worden de persoongegevens weergegeven.

[zoekveld]

[keuzelijst]
1 Piet
2 Jan
[3 Klaas]
4 Hein

In dit geval: klikken of zoeken op "3" en je ziet de adresgegevens van klaas (tis maar een voorbeeld).

Uiteraard geen problemen hier, echter, de gebruikers hadden gevraagd om de zoekfunctie uit te breiden met een aantal velden, bijv. niet alleen het nummer maar ook de naam en de woonplaats.

Dat heb ik gemaakt door bij [keuzelijst].rowsource = "" een query op te geven na bijwerken van het keuzeveld die parameters heeft voor de vereiste zoekvelden (die allemaal in dat ene zoekveld ingegeven worden, dus EN nr, EN naam, EN plaats en nog andere velden)
Als je dus in het zoekveld Amsterdam ingeeft, zie je nu iedereen die in Amsterdam woont.

Welnu: als je een zoekopdracht geeft die meerdere records als resultaat geeft (Piet en Heijn wonen in beide amsterdam), dan zal de gebruiker zelf nog met de muis de juiste persoon moeten aanklikken om zijn gegevens te zien.

Als je echter een zoekopdracht ingeeft die maar 1 resultaat geeft (bijv zoeken op "Piet") dan zou de computer zelf die ene record moeten selecteren en de bijbehorende gegevens moeten weergeven, want er is maar 1 mogelijke record, dus waarom nog eens extra klikken.

Ik heb daarvoor de volgende code achter het zoekveld gezet:

code:
1
2
3
4
5
6
7
8
9
10
11
Dim CTL As Control

Me![keuzelijst].RowSource = "zoek persoon"

If Me![keuzelijst].ListCount - 1 = 1 Then

    Set CTL = Me![keuzelijst]
    CTL.Selected(1) = True
    '  MsgBox CTL.Column(0, 1)

End If


m.a.w.:
- eerst beperkt het zoekveld de inhoud van de keuzelijst dmv baseren op de query "zoek persoon" met parameters obv het zoekveld
- daarna wordt bekeken of de keuzelijst 1 resultaat weergeeft
- volgende stap is het selecteren van die ene regel
(- ter controle wordt in een msgbox de sleutel (persoonsnr) weergegeven) -> nu uitgeschakeld

That's it, werkt allemaal.

Het probleem (hehe ;) ):
Na uitvoering van de code en weergave van die ene regel, die ook nog eens geselecteerd is (!), kan ik verder helemaal niets
Om te beginnen is dus wel degelijk de juiste regel geselecteerd, want in de msgbox verschijnt de geselecteerde regel van de keuzelijst, maar in het scherm worden niet de persoonsgegevens weergegeven zoals wanneer je op het scherm klikt, dit terwijl via selected de record geselecteerd is.
Als ik dan de keuzelijst wil laten herberekenen (.requery) dan gaat dat niet, krijg ik een foutmelding over het opslaan van een record (?!) die ik niet thuis kan brengen.
Verder werkt ook klikken op de keuzelijst niet, op de een of andere manier is dat ding niet beschikbaar. Requery, repaint etc op het formulier of de keuzelijst geven allemaal foutmeldingen, de focus kan niet verplaatst worden, ik kan helemaal NIETS.
Ook zoiets raars is dat als ik zoek op een persoon en ik maar 1 record terugkrijg ik zijn nummer in beeld krijg (msgbox) en de juiste record geselecteerd zie, maar als ik dan naar de ontwerpweergave van het scherm ga dan krijg ik NOG eens die msgbox met dat nummer in beeld.

Het lijkt wel alsof access in 1 of andere loop vastzit.

Ik heb geen idee wat er aan de hand is en ik heb toch wel redelijk ervaring met Access en VBA, maar ik zit hier al 2 dagen op de kloten... :'( volgens mij overzie ik een heel simpel detail of zo

[ Voor 5% gewijzigd door Stefke op 08-10-2003 21:35 ]


  • ATS
  • Registratie: September 2001
  • Laatst online: 12-02 13:46

ATS

Twee vragen: hoe zit je navigatie in elkaar (dus: op welke manier zorg je dat je bij klikken in de keuzelijst ook dat record ziet?) en wat is de gegevensbron van je formulier? Is dat toevallig ook [zoek persoon]?

My opinions may have changed, but not the fact that I am right. -- Ashleigh Brilliant


  • Stefke
  • Registratie: December 2000
  • Laatst online: 20-08 12:02
de gevensbron van het formulier is een query obv de tabel personen, met als parameter de persoon_id, gebaseerd op de keuzelijst (dus selecteren in de keuzelijst levert een persoon_id op waarop het formulier bij me!requery de bijbehorende record laat zien).

De keuzelijst wordt dus gebruikt om te navigeren tussen de records.

Misschien moet ik even proberen om het formulier niet obv een query te maken maar gewoon op de tabel, en dan een filter toe te passen obv de selectie in de keuzelijst (want de bovenstaande code levert wel een persoonid op, zie msgbox). Waarschijnlijk werkt dat in dit geval beter, maar ik snap niet waar de code in "hangt", waarom ik na de "CTL.Selected(1) = True" niets meer kan doen en telkens opnieuw die msgbox krijg.