Autore Topic: filtrare combobox  (Letto 5972 volte)

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
filtrare combobox
« il: 31 Luglio 2010, 23:41:32 »
vorrei usare, come si fa di solito, la combobox filtrando le item in base a quello che scrivo su combobox.text. Sapete dirmi se c'è un esempio da scaricare ?
Matteo DoubleMM Mion

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
Re: filtrare combobox
« Risposta #1 il: 01 Agosto 2010, 11:40:38 »
non so se sono sulla strada giusta: Ho eseguito una procedura lostfocus dove ricreo l'elenco delle item aggiungendo alla query un WHERE descrizione LIKE %text%
e poi un combo.popup

funziona tutto ma non riesco a riposizionare il cursore sul ext della combo per continuare a scrivere altri caratteri e restringere la ricerca. Funziona solo se con il mouse mi riposiziono sulla combo.
Matteo DoubleMM Mion

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: filtrare combobox
« Risposta #2 il: 01 Agosto 2010, 12:27:52 »
§Hai provato ad eseguire tuttoil processo nella sub Change di Combobox?

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
Re: filtrare combobox
« Risposta #3 il: 01 Agosto 2010, 13:37:04 »
non funziona perchè se digito una lettera sull'area di testo della combo non scateno l'evento combo change quindi non mi filtra le item.

il funzionamento è così:

digito un carattere sull'area text di combobox per esempio A

Codice: gambas [Seleziona]

PUBLIC SUB ComboDescrizione_KeyRelease()

  MakeComboDescrizione()
 
  ComboDescrizione.Popup    ' qui mi apre la lista correttamente filtrata in base ai caratteri scritti sulla text di combobox
  ComboDescrizione.SetFocus ' qui vorrei posizionarmi sulla text di combobox per aggiungere un altro carattere a quello già scritto ma non succede

END


Codice: gambas [Seleziona]

PUBLIC SUB MakeComboDescrizione()
DIM variabile AS String
 
  OpenDB()
 
  ComboDescrizione.Clear
 
  variabile = "%" & ComboDescrizione.Text & "%"
   
  sql = "SELECT*FROM DESCRIZIONE WHERE descrizione LIKE '" & variabile & "'"
  hres = $hConn.Exec(sql)
 
  FOR EACH hres
    IF hres.Available = TRUE THEN
      ComboDescrizione.Add(hres!descrizione)
    ENDIF
  NEXT
 
  ComboDescrizione.Sorted = TRUE
 
  $hConn.Close
 
END

Matteo DoubleMM Mion

Offline Berserker79

  • Grande Gambero
  • ***
  • Post: 201
    • Mostra profilo
Re: filtrare combobox
« Risposta #4 il: 01 Agosto 2010, 15:48:04 »
Ma perchè hai deciso di utilizzare una combobox per digitare il testo da usare come filtro?
Credo sia più opportuno usare una textbox ed effettuare la ricerca con l'evento change.
Io solitamente uso le combobox per proporre dei valori e permettere all'utente di scegliere quello desiderato.
Che sò, avrebbe senso se al caricamento del form, la combobox venisse popolata dagli item del db e quindi tu selezionassi quello desiderato per filtrare il risultato.
Il mio vuole essere un consiglio in base alle informazioni che hai dato, magari per il tuo progetto la combobox è la scelta migliore.
Ciao.

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
Re: filtrare combobox
« Risposta #5 il: 01 Agosto 2010, 16:39:05 »
infatti la combobox viene popolata all'apertura del form. Come succede su altri programmi io volevo ridurre le proposte della combobox in base a cosa viene scritto al suo interno. Ti faccio un esempio

combobox:
FORNITORI
GESTIONE
SPESE FISSE
ETC ETC

siccome le voci sono tante e potrebbero crescere utilizzando il prog volevo fare in modo che se nella combo scrivo F l'elenco della combo mi mostri solo le voci che contengono F questo perchè voglio fare in modo che l'utente non scriva cose del tipo una volta FORNIORI e un altra FORNITORE però che la scelta si possa filtrare come dicevo prima.

dal codice che ho postato il filtro funziona ma dopo aver inserito la prima lettera sulla combo apro la tendina vedo la lista filtrata ma se voglio inserire un altra lettera (per esempio ho inserito F ma voglio filtrare ulteriormente aggiungendo una O quindi FO) mi devo posizionare sulla combo con il mouse. Se si potesse automatizzare sarebbe molto più veloce. Altrimenti userò una textbox associata a una listview. Ti ringrazio della tua opinione.
Matteo DoubleMM Mion

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: filtrare combobox
« Risposta #6 il: 01 Agosto 2010, 18:06:34 »
Ciao, vedi se puoi adattare questo mio codice, magari domani se ho più tempo vedo di fare meglio :D
Codice: gambas [Seleziona]

PUBLIC SUB tbfornit1_Change()

DIM sql AS String
DIM p AS Integer
DIM myfiltro AS String
 
p = tbfornit1.Pos
 IF p > 0 THEN
  myfiltro = Left$(tbfornit1.Text, p)
  sql = "select * from fornitori WHERE "
  sql = sql & "fornitore  LIKE '" & myfiltro & "%' "
  sql = sql & "order by fornitore"             
  MyRS = MODMain.$conn.Exec(sql)                   
      IF MyRS.Available = TRUE THEN
        MyRS.movefirst
        tbfornit1.Text = myfiltro & Right$(MyRS!fornitore, (Len(MyRS!fornitore) - p))
        tbfornit1.Pos = p
        tbidfornitore.Text = MyRS!idfornitore
        ELSE
        tbfornit1.Pos = p
        tbfornit1.Text = dettagli.deffornitore
        tbidfornitore.Text = dettagli.defidfornitore
      ENDIF
  ENDIF

END


Fammi sapere

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
Re: filtrare combobox
« Risposta #7 il: 01 Agosto 2010, 18:18:03 »
non vedo combo.popup. Se non sbaglio il tuo codice non apre e mostra le item della combo. Il mio codice funziona se non faccio aprire la combo, se scrivo FO e poi apro la combo trovo le item che contengono FO. Il problema e se uso popup per vedere le item filtrate, se non la chiudo manualmente non riesco a inserire niente nella text della combo
Matteo DoubleMM Mion

Offline Golia

  • Senatore Gambero
  • ******
  • Post: 1.298
  • no xe mai massa tardi
    • Mostra profilo
Re: filtrare combobox
« Risposta #8 il: 01 Agosto 2010, 18:21:37 »
Scusa, forse ho letto troppo in fretta.
Il mio codice non prevede combobox, ma una semplice textbox.
Filtra mam mano che scrivi e ti restitusce il nome che trova
Es.
a -> abramo
al -> aldo
 e via dicendo

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
Re: filtrare combobox
« Risposta #9 il: 01 Agosto 2010, 18:23:33 »
in sostanza io vorrei, una volta aperta la comco con combo.popup tornare a scrivere nella combo.text senza doverlo fare con il mouse ma solo digitando una nuova letera da tastiera
Matteo DoubleMM Mion

Offline Berserker79

  • Grande Gambero
  • ***
  • Post: 201
    • Mostra profilo
Re: filtrare combobox
« Risposta #10 il: 01 Agosto 2010, 19:29:51 »
Mi sa che la cosa è impossibile.
Infatti quando richiami l'evento popup, devi agire obbligatoriamente sulla tendina aperta e non ti è possibile fare altro, ma questo proprio a livello di sistema operativo.


Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: filtrare combobox
« Risposta #11 il: 01 Agosto 2010, 23:28:28 »
@ doublemm:
Combinare le due funzionalità di digitazione e visualizzazione dei dati filtrati nella combobox é impossibile; potresti utilizzare una TextBox per la digitazione della parola e, sfruttando l'evento change di quest'ultima, riempire una listbox posizionandola magari sotto la textbox.
per cui:
Scrivo "F" nella TextBox
                                     --> in TextBox_Change :   filtro i dati dal DB caricando la ListBox di tutte le parole che iniziano con "F"
Ora posso cliccare sulla parola se esiste e in
                                     --> ListBox.Click:   trasferisco la parola selezionata in TextBox.Text
oppure, posso aggiungere una 2^ lettera nella TextBox, per Es. "O"
                                     --> in TextBox_Change :   filtro i dati dal DB caricando la ListBox di tutte le parole che iniziano con "FO"
il ciclo continua fino a quando trovo la parola cercata o fino al completamento della nuova parola nella TextBox.
Ovviamente, a fine digitazione, avrai già pensato ad aggiuingere la nuova parola nel DB.

Se l'idea ti sembra buona, puoi provare. :D
Ciao.
:ciao:

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
Re: filtrare combobox
« Risposta #12 il: 01 Agosto 2010, 23:44:50 »
si infatti ho fatto così. Mi è sorto un problema però. La sequenza è questa:

inserisco un testo sulla textbox
l'evento keyrelase mi provoca l'aggiornamento della listbox in base al testo digitato.
listbox_clic analizza l'item di listbox cambi i dei valori su dei radiobox e fare click utton
ora dovrei inserire un importo su una valuebox per poi salvare il tutto su di un db

Ho provato a mettere sull'evento listbox_click alla fine del codice valuebox.setfocus ma il focus non cambia. devo posizionarmi sulla valuebox e fare click col mouse e non solo ma quando digito nella textbox un valore da cercare, mi compare nella listbox ma se mi sposto col tab listbox non prende mai il focus.
Matteo DoubleMM Mion

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re: filtrare combobox
« Risposta #13 il: 02 Agosto 2010, 00:10:25 »
Attenzione agli eventi Focus. Vedi mia sofferta vicissitudine corrente http://www.gambas-it.org/smf/index.php?topic=1226.0.

Comunque l'evento Keyrelease dovrebbe manifestarsi prima ancora dell'evento change; però non sono sicuro, non l'ho mai testato. Se é come penso la TextBox.Text non dovrebbe, in quel momento contenere il carattaere ultimo digitato.

Prova poi a mettere delle istruzione print del tipo
Print "Passaggio in Text_GotFocus"
Print "Passaggio in Listox_GotFocus"
Print "Passaggio in valueBox_GotFocus"
per capire come si comporta il programma.

Buon lavoro e buono studio.  :)
:ciao:

Offline doublemm

  • Maestro Gambero
  • ****
  • Post: 445
    • Mostra profilo
Re: filtrare combobox
« Risposta #14 il: 02 Agosto 2010, 08:25:38 »
stasera provo perchè ora son al lavoro. Se non ricordo male l'unico evento che ho usato sulla textbox è key_relase dove ho scritto:

Codice: gambas [Seleziona]

makegridbox()
if key.code =key.tab then
  listbox.getfocus
endif


l'unico evento su listbox è listbox_click che dovrebbe passare il focus a valuebox ma ne key.tab ne il focus sulla value funzionano anche se il programma passa di la perchè i PRINT che ho messo fanno il loro dovere.

Vado a fare i tramezzini altrimenti i clienti i lamentano  :party:
Matteo DoubleMM Mion