Condividi tramite

Maschera Access: posizionamento iniziale su ListBox

Anonimo
2019-09-29T14:21:54+00:00

Buongiorno,

ho un problema con una ListBox, che carico da una Query. su una maschera non associata. Nel file di esempio allegato semplifico il problema:

  • Listbox semplificata al massimo: ID, Testo
  • Attivo la maschera (da routine VBA) passando (OpenArgs) un codice iniziale (diciamo “ID”=3)
  • Vorrei che l’utente trovi la List Box già posizionata su questo elemento, senza doverla scorrere per posizionarsi sull’elemento desiderato.

In teoria dovrebbe essere fattibile senza grossi problemi: ho provato con i vari Eventi, ma evidentemente non ho trovato quello giusto (trovo la ListBox sempre “Null”).

Grazie e buona giornata

Ivo

https://drive.google.com/file/d/1fuBIa4QNqBk_qlnTCgbJZqkoIl_TNHie/view?usp=sharing

Microsoft 365 e Office | Access | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2019-09-30T05:33:39+00:00

ciao Ivo53,

[…]

Grazie, Sandro.

[...]

Prego!

[...]

Evidentemente mi ero concentrato sull'evento "Load", trascurando "Open" - che viene attivato prima di "Load"! (anche se "Load", caricare, "a naso" dovrebbe venire prima di "Open", aprire).

[....]

i dubbi sulla corretta esecuzione dell'ordine degli eventi nelle forms vengono spesso anche a me, di conseguenze mi rifaccio sempre a questo link :

https://support.office.com/it-it/article/ordine-degli-eventi-per-gli-oggetti-di-database-e76fbbfe-6180-4a52-8787-ce86553682f9

tieni in considerazione che quando devi manipolare dati all'interno della form l'evento su apertura non sempre è quelllo più indicato anche se si scatena per primo. Proprio per il fatto che si scatena per primo, a volte i dati non sono disponibili e la routine evento non sempre restituisce quanto ci si aspetta, per cui è necessario rifarsi all'evento on load in tali casi.

[...]

Buona serata

Ivo

[...]

visto che sono in ritardo, buon inizio settimana.

Ciao, Sandro.

ps., ti chiederei la gentilezza di modificare il nome nella tua risposta all'altro utente che si è inserito in questo 3D qui ( vedi grassetto ):

[...]

Scusami, Sandro, ma "il senso" è semplice: devo (voglio) richiamare la medesima mappa (ovviamente non quella semplice che ho creato per farmi capire!) in due modi:

[...]

grazie ancora.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

Risposta accettata dall'autore della domanda

Anonimo
2019-09-29T17:17:58+00:00

ciao Ivo53,

gli openArg si utilizza per passare valore da una form ad un altra o anche a un report.

Non ho capito bene come lo stai utilizznado...

Prova come segue nell'evento su apertura della tua form msktlb1: 

Private Sub Form_Open(Cancel As Integer)

Dim lngItem As Long

With Me.lst1

    For lngItem = 0 To .ListCount - 1

        If .ItemData(lngItem) = 3 Then Exit For

    Next

    .Selected(lngItem) = True

    If .ListIndex = -1 Then

        VBA.MsgBox prompt:="Nessun ID individuato", _

                   buttons:=vbInformation + vbOKOnly, _

                   title:="Informazione"

    End If

End With

End Sub

in un loop cerchi il valore id scorrendo la colonna associata id e non appena lo trovi, associ l'indice del loop alla property selected della listBox uscendo forzatamente dal loop. Così, indipendentemente dal sorting della query, selezioni l'item di interesse.

Se a loop concluso non individui alcuna corrispondenza avvisi con un messaggio.

l'assegnazione che segue è decisamente statica:

If .ItemData(lngItem) = 3

ovvio che nello statement if puoi gestire il valore da cercare con una variabile, o passando la propery openArgs qualora valorizzata da un altro oggetto form, in modo da rendere il tutto maggiormente flessibile.

HTH.

Ciao, Sandro.

La risposta è stata utile?

1 persona ha trovato utile questa risposta.
0 commenti Nessun commento

3 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2019-09-29T19:37:54+00:00

    "Il senso" è semplice: devo (voglio) richiamare la medesima mappa (ovviamente non quella semplice che ho creato per farmi capire!) in due modi:

    a) "nativamente" (clicco su un  pulsante che apre la maschera): in questo caso non passo nessun parametro (OpenArgs è nullo): pertanto la mappa si presenta con la Listbox selezionabile a piacere

    b) richiamata da un'altra mappa che svolge alcune operazioni su un determinato ID. In questo caso, se richiamo la mappa senza OpenArgs, l'utente deve riposizionarsi sull'elemento che gli interessa - magari sbagliando … ma è quello cu cui ha operato finora!! Certo, potrei anche attivare le funzioni della mappa (questa, con la Listbox, intendo) senza chiedere conferma, negandogli così la possibilità di rinunciare (o, eventualmente, di selezionare altri elementi su cui operare insieme).

    Ovviamente la mappa in questione non ha solo la Listbox, ma anche altri oggetti (pulsanti) 

    Buona serata

    Ivo

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2019-09-29T19:03:32+00:00

    Basta modificare il codice nel seguente modo:

    Private Sub Form_Load()

    Me.lst1 = Nz(Me.OpenArgs, 0)

    lst1_AfterUpdate

    End Sub

    ed oltre a posizionarsi sulla riga corretta della listbox aggiorna anche i dati dei due controlli.

    Naturalmente quello che stai facendo, almeno da quello che si può vedere, non ha senso.

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2019-09-29T18:16:27+00:00

    Grazie, Sandro.

    Evidentemente mi ero concentrato sull'evento "Load", trascurando "Open" - che viene attivato prima di "Load"! (anche se "Load", caricare, "a naso" dovrebbe venire prima di "Open", aprire).

    Buona serata

    Ivo

    La risposta è stata utile?

    0 commenti Nessun commento