Casella Combinata - impedire inserimenti fuori lista

di il
24 risposte

Casella Combinata - impedire inserimenti fuori lista

Ho una casella combinata multicolonna impostata come in figura allegata.

Devo eliminare la possibilità di scrivere direttamente nella casella combo...

Se imposto la voce "Bloccato=si", raggiungo lo scopo parzialmente perchè poi non si riesce a selezionare una voce
dall'elenco. Non risponde a nessun evento, per cui non è gestibile.

Ho provato ad intercettare l'inserimento indesiderato con la funzione "NotinList", reimposto il valore della casella combo a "", .value="", ma access ritorna sempre il seguente messaggio:
Il testo immesso non corrisponde a una voce dell'elenco
Selezionare una voce dall'elenco oppure immettere del testo che corrisponda a una delle voci elencate.



Da un'altra parte ho intercettato l'errore e reimpostato il valore:

On error goto...
.
.
.
ErrorHandler:
 Err.Clear
 Form_Home.CasellaCombinata0.Value = ""
E funzionerebbe se non fosse che l'elenco è composto da una lettera seguita da un numero, S1, S2...Sn
Se dovessi inserire la lettera dell'elenco, access mi inserisce automaticamente la prima selezione disponibile e parte l'elaborazione di quella entità (tavolo), che è la situazione peggiore.

Si può ovviare l'inserimento non in elenco?

Grazie

24 Risposte

  • Re: Casella Combinata - impedire inserimenti fuori lista

    Hm....scusa,ma se ckicchi sulla freccina laterale
    Non ti appare una lista dove puoi scegliere il valore desiderato?
    Se poi appena scrivi qualcosa, ti parte l elaborazione, forse è il caso che rivedi il codice sulk evento change, lost focus o after update.
    Comunque si, si può ovviare impostando consenti aggiunte o si su noninlist
  • Re: Casella Combinata - impedire inserimenti fuori lista

    Certo che se clicco sulla freccia laterale si apre la lista ma la casellacombo deve partire con la casella vuota.

    Che rivedo, devono scegliere uno tra i valori della lista, questa operazione scatena l'evento _Change(), avendo impostato "solo valori in lista": o parte una elaborazione o c'è un msg di errore perchè la scelta non è in lista, valore inserito a mano.

    Il messaggio di errore lo intercetto e lo cancello, e comunque lo gestisco, se l'inserimento "accidentale/maldestro/volontario" corrisponde alla lettera iniziale della lista, automaticamente parte l'evento change che riconosce valida la change con un valore della lista perchè è lui che automaticamente la completa col primo item disponibile della lista.
    E' un valore valido, io non so se scelto tra la lista a discesa oppure un incidente.

    Consenti aggiunte lo devo impostare a NO perchè la lista è predefinita e non variabile dall'utente
    Noninlist, lo posso usare per i valori non in lista...Ma già lo gestisco con ON Error Goto, e quello che devo intercettare è il valore in lista accidentale, quindi il noninlista non viene richiamato.

    In sostanza...Non ci dovresti poter scrivere o modificare i valori della lista ma se blocco la casella non riesco a selezionare alcun Item.
  • Re: Casella Combinata - impedire inserimenti fuori lista

    In pratica non devi usare una combo, ma una normale casella di testo, con relativo codice vb
  • Re: Casella Combinata - impedire inserimenti fuori lista

    Se posti un file di esempio su un sito di condividione dati, tipo Dropbox o altro, forse è più semplice verificare che cosa accade e quindi darti un aiuto.
  • Re: Casella Combinata - impedire inserimenti fuori lista

    StefBeck ha scritto:


    Ho una casella combinata multicolonna impostata come in figura allegata.
    Io non vedo alcuna immagine allegata.

    StefBeck ha scritto:


    Devo eliminare la possibilità di scrivere direttamente nella casella combo...
    Che vuol dire? Se hai una combo, tale combo serve per scriverci almeno i primi caratteri...Non capisco.

    StefBeck ha scritto:


    Se imposto la voce "Bloccato=si", raggiungo lo scopo parzialmente perchè poi non si riesce a selezionare una voce
    dall'elenco. Non risponde a nessun evento, per cui non è gestibile.

    Ho provato ad intercettare l'inserimento indesiderato con la funzione "NotinList", reimposto il valore della casella combo a "", .value="", ma access ritorna sempre il seguente messaggio:
    Il testo immesso non corrisponde a una voce dell'elenco
    Selezionare una voce dall'elenco oppure immettere del testo che corrisponda a una delle voci elencate.
    Hai una combo con Bloccato=Sì e poi vuoi gestire NotInList. Mi sembra una contraddizione. Non capisco nulla.

    Racconta tutto passo passo, usando nomi propri di maschera, campi, casella combinata. Fai anche un esempio concreto così che si possa capire il problema vero.
  • Re: Casella Combinata - impedire inserimenti fuori lista

    Devi gestire il keysdown o keyup. Annullando la digitazione e riportando il controllo a undo.
    Mai fatto e quindi non so se ti intercetta anche la freccia laterale della tendina. Oppure alla casareccia, senza coprire la freccia della tendina, sopra la combo, disegni una text box, sfondo trasparente, bordi trasprente, e la blocchi. Poi devi gestire anche l ancoraggio, in caso di ridimensionamento o espansione della form. Certo è una prcionata stile access 2.0.
  • Re: Casella Combinata - impedire inserimenti fuori lista

    Si usa una ListBox in questi casi insieme ad una TextBox ed un Button(facoltativo).
    Su Click del Button(io uso il DoubleClick della TextBox) espandi la ListBox che sarà posizionata sotto la TextBox con Altezza=0 e/o Visible=False, e diventerà Altezza=Quello che vuoi e/o Visible=True... su AfterUpdate della ListBox sposti il Focus sulla TextBox e copi il valore, su Exit della TextBox a Prescindere riporti l'altezza della ListBox=0 e/o Visible=False
    Ovviamente se digiti nella TextBox devi poi tener conto di sincronizzare la ListBox e quì viene il difficile... perchè solitamente nella ListBox vedi del Testo ma usi la HiddenColumn(0) con l'indice...!

    Cose SEMPLICI... soprattutto quando non si ha dimestichezza...!
  • Re: Casella Combinata - impedire inserimenti fuori lista

    Comunque io sinceramente non ho ben capito cosa vuoi realizzare e ci stai fuorviando nelle soluzioni, perchè pensi di poter ottenere un effetto e descrivi il tuo metodo e non quello che effettivamente dovrebbe essere realizzato.
    Se ho capito quello che vuoi ottenere, come detto nel mio primo post, non devi gestire l'evento change, ma l'evento dopo aggiornamento.
    In questo modo quando digiti qualcosa, anche se l'autocompletamento ti completa il testo, non viene attivato nessun evento e quindi non viene attivata nessuna ricerca.
    L'evento e quindi l'effetto desiderato, si attiva solo se premi invio dopo l'autocompletamento, se scegli un valore dal menù a tendina, se premi tab, oppure clicchi su altri controlli.
  • Re: Casella Combinata - impedire inserimenti fuori lista

    fratac ha scritto:



    Se ho capito quello che vuoi ottenere, come detto nel mio primo post, non devi gestire l'evento change, ma l'evento dopo aggiornamento.
    Effettivamente è così!

    Spostando il codice sotto l'evento AfterUpdate e gestendo l'evento Change si realizza quanto richiesto
    Per completezza posto un esempio funzionante con dati reali, la configurazione della combo in figura, la mia è collegata ad una tabella di un server sql ma la sostanza non cambia.
    Form con una casella combinata
    
    
    Option Compare Database
    
    Dim B_evento As Boolean 'Switch per l'evento Change
    Private Sub CasellaCombinata0_AfterUpdate()
        MsgBox ("AfterUpdate hai selezionato dalla lista valore:" & CasellaCombinata0.Value)
        'Setta la variabile per bypassare l'effetto dell'evento Change
        'mantenendo la selezione effettuata
        B_evento = True
    End Sub
    
    
    Private Sub CasellaCombinata0_Change()
        
        'Cancella qualsiasi valore non selezionato dalla lista
        If Not B_evento Then CasellaCombinata0.Value = ""
        'Reimposta la variabile
        B_evento = False
    End Sub
    
    
    

    Immagine3.jpg
    Immagine3.jpg

    Grazie per la pazienza.

    P.S.
    Le liste non si possono colorare diversamente tra loro, giusto?
  • Re: Casella Combinata - impedire inserimenti fuori lista

    Ciao.
    Sono contento di esserti stato di aiuto.
    Però ho due curiosità.
    La prima, è la solita, che mi ha inizialmente fuorviato.
    In questo modo inibisci la digitazione nella combo box. Una cosa a cui non avevo mai pensato e quindi ho imparato qualcosa.
    Però non ne capisco l'utilità.
    Come detto, l'autocompletamento non innesca nessun evento, a meno che non ci sia del codice su "change" ("Su modifica"), ad esempio una query di ricerca, dove effettivamente, appena trova il primo valore valido, l'autocompletamento, fa partire il codice.
    Quello che non capisco è perchè fai eseguire una query su change, quando invece se la sposti direttamente su "dopo aggiornamento", praticamente nella combo box, puoi scrivere quello che ti pare, ma se non selezioni un valore dalla tendina, oppure premi invio o sposti il focus, non viene attivato nessun evento della combo box. Quindi senza aver bisogno di bloccare la digitazione.
    E' solo per evitare il messaggio di valore non in elenco?
    Se così fosse effettivamente è un modo veloce per ottenere l'effetto, senza doverlo gestire in altro modo che è sicuramente più ostico.
    Ma se effettivamente non hai problemi con il messaggio, secondo me puoi anche permettere la digitazione, perchè se dovessi avere molti valori tra cui scegliere, dovresti cercarli manualmente nella tendina e l'autocompletamento ti sarebbe di grande aiuto, senza contare che il messaggio, aiuta l'utente a capire se un valore è già stato inserito nell'origine riga.
    A patto, come detto, naturalmente che tu faccia eseguire il codice di ricerca "su dopo aggiornamento" e non "su modifica".
    La seconda curiosità, e non voglio farmi gli affari tuoi.
    Se il motivo, non rientra nella prima curiosità, in che modo ritorna utile il blocco della digitazione?
    E' solo un effetto "estetico", oppure ha una reale esigenza che non riesco ad immaginare?

    Per quanto riguarda invece le righe alternate, non so risponderti con sicurezza, perchè non ho mai avuto l'esigenza e quindi non ho mai investigato, ma da quello che so, ti devi accontentare di un coloro unico, che è quello dello sfondo della combo box.
  • Re: Casella Combinata - impedire inserimenti fuori lista

    A peoposito.
    Nel vba metti anche option explicit, oltre che il compare database, altrimenti non ti avverte che non hai dichiarato le variabili.
  • Re: Casella Combinata - impedire inserimenti fuori lista

    Perchè usare AfterUpdate... e non BeforeUpdate...?
    After non è annullabile, quindi l'evento è a modifica avvvenuta, il Before è annullabile... sostanzialmente è transazionale, ma se sono inibiti i valori NON in LISTA, come dovrebbe essere da richiesta, come sarà mai possibile si possa scatenare questo evento...? Si scatena il NotInList da gestire e mai l'After se si annulla.

    Secondo me vi state girando su voi stessi...!
  • Re: Casella Combinata - impedire inserimenti fuori lista

    @Alex ha scritto:


    Perchè usare AfterUpdate... e non BeforeUpdate...?
    After non è annullabile, quindi l'evento è a modifica avvvenuta, il Before è annullabile... sostanzialmente è transazionale, ma se sono inibiti i valori NON in LISTA, come dovrebbe essere da richiesta, come sarà mai possibile si possa scatenare questo evento...? Si scatena il NotInList da gestire e mai l'After se si annulla.

    Secondo me vi state girando su voi stessi...!
    Ho testato entrambi gli eventi, e l'effetto che si ottiene è lo stesso, sia se è attivato il non il lista oppure no.
    Solo se si digita molto velocemente, ma molto velocemente, a volte viene visualizzato l'autocompletamento, ma viene subito cancellato e non parte nessun evento.
    A livello logico e tecnico effettivamente è più logico usare il before.
    Ho suggerito l'after, perchè a me serve l'autocompletamento per fare avviare l'evento.
    Ma sicuramente lo stesso effetto si può tranquillamente avere anche gestendo il keydown o il keyup o key press.
  • Re: Casella Combinata - impedire inserimenti fuori lista

    fratac ha scritto:


    Ciao.
    Sono contento di esserti stato di aiuto.
    Però ho due curiosità.
    La prima, è la solita, che mi ha inizialmente fuorviato.
    In questo modo inibisci la digitazione nella combo box. Una cosa a cui non avevo mai pensato e quindi ho imparato qualcosa.
    Però non ne capisco l'utilità.
    Come detto, l'autocompletamento non innesca nessun evento, a meno che non ci sia del codice su "change" ("Su modifica"), ad esempio una query di ricerca, dove effettivamente, appena trova il primo valore valido, l'autocompletamento, fa partire il codice.
    Perchè alla selezione di una voce in lista richiama i dati da un DB, quindi eseguo delle azioni in funzione della scelta.

    fratac ha scritto:


    Quello che non capisco è perchè fai eseguire una query su change, quando invece se la sposti direttamente su "dopo aggiornamento", praticamente nella combo box, puoi scrivere quello che ti pare, ma se non selezioni un valore dalla tendina, oppure premi invio o sposti il focus, non viene attivato nessun evento della combo box. Quindi senza aver bisogno di bloccare la digitazione.
    E' solo per evitare il messaggio di valore non in elenco?
    Se così fosse effettivamente è un modo veloce per ottenere l'effetto, senza doverlo gestire in altro modo che è sicuramente più ostico.
    Il messaggio di errore è una perdita di tempo ed una scocciatura per l'operatore, lo distrae e gli va in antipatia il programma.

    La soluzione che è arrivata col tuo contributo è perfetta, nessun messaggio di errore, digitazioni spurie non visualizzate ecc.

    fratac ha scritto:


    Ma se effettivamente non hai problemi con il messaggio, secondo me puoi anche permettere la digitazione, perchè se dovessi avere molti valori tra cui scegliere, dovresti cercarli manualmente nella tendina e l'autocompletamento ti sarebbe di grande aiuto, senza contare che il messaggio, aiuta l'utente a capire se un valore è già stato inserito nell'origine riga.
    A patto, come detto, naturalmente che tu faccia eseguire il codice di ricerca "su dopo aggiornamento" e non "su modifica".
    Senza messaggi di errore il funzionamento è pulito e lineare.
    Il requisito è non dare libertà all'operatore, selezionare dalla lista...Spostando l'evento da Change a Afterupdate non lo so ma prima non facevi in tempo a digitare il numero dopo la lettera, per cui non era possibile avere la "selezione veloce".

    Partiva sempre il primo elemento della lista

    fratac ha scritto:


    La seconda curiosità, e non voglio farmi gli affari tuoi.
    Se il motivo, non rientra nella prima curiosità, in che modo ritorna utile il blocco della digitazione?
    E' solo un effetto "estetico", oppure ha una reale esigenza che non riesco ad immaginare?
    Non c'è nessun segreto, il programma è un sistema di comande per un ristorante, i camerieri non devono perdere tempo con messaggi di errore e digitazioni sbagliate, più veloce e semplice possibile.
    a prova di idiota, col rispetto per la categoria.
    Per farVi capire con chi si ha a che fare, l'intenzione iniziale era quella di utilizzare dei monitor touch...Causa le unghie lunghe, le ragazze avevano difficoltà nell'utilizzare il touch, ho dovuto mettere mouse + tastiera.

    Quando mi hanno presentato l'anomalia del messaggio di errore per caratteri non compresi nella lista, ho risposto che è sufficiente non scrivere nulla nella combo ma SEMPLICEMENTE utilizzare i valori della tendina.

    Ve ne posso raccontare a iosa di situazioni che per noi non sono un bug ma che per loro sono un enorme problema.

    fratac ha scritto:


    Per quanto riguarda invece le righe alternate, non so risponderti con sicurezza, perchè non ho mai avuto l'esigenza e quindi non ho mai investigato, ma da quello che so, ti devi accontentare di un coloro unico, che è quello dello sfondo della combo box.
Devi accedere o registrarti per scrivere nel forum
24 risposte