Autore Topic: ComboBox e Indice  (Letto 1409 volte)

Offline luca.decarlo

  • Gamberetto
  • *
  • Post: 49
    • Mostra profilo
ComboBox e Indice
« il: 10 Dicembre 2015, 18:32:32 »
Ho letto vari post ed ho notato che è un'esigenza comune a tutti.


esempio:

Ho un db utenti composto da id e nome utente, dovrei caricare il nome utente nella combo con:
 
Codice: [Seleziona]
  rHres = $hConn.Exec("SELECT * FROM utenti;")
  For Each rHres
    cmbUtente.Add(rHres!utente)
  Next

e dovrei indicare anche l'id dell'utente, che possono non essere consecutivi, in maniera che dopo la scelta del nome utente, possa utilizzare l'id dell'utemte stesso.

per capirci tipo "itemdata" di vb6!!

Grazie

Luca
« Ultima modifica: 10 Dicembre 2015, 18:33:21 da luca.decarlo »

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re:ComboBox e Indice
« Risposta #1 il: 11 Dicembre 2015, 11:48:48 »
Ciao Luca,
io uso questo metodo da sempre dopo averci sbattuto la testa varie volte, essendo le Combo
un pò ostiche, vedi se ti può essere utile
Codice: [Seleziona]
Private $hCmbIdUtente As New Object[]
 
 rHres = $hConn.Exec("SELECT * FROM utenti;")
  cmbUtente.Clear()
  $hCmbIdUtente.Clear()
  For Each rHres
    cmbUtente.Add(rHres!utente)
    $hCmbIdUtente.Add([rHres!id_utente, rHres!utente])
  Next

Public Sub cmbUtente_Click()
  Print $hCmbIdUtente[cmbUtente.Index][0]
End

nel caso volessi il primo elemento della Combo "vuoto"
Codice: [Seleziona]
Private $hCmbIdUtente As New Object[]
 
 rHres = $hConn.Exec("SELECT * FROM utenti;")
  cmbUtente.Clear()
  $hCmbIdUtente.Clear()
  cmbUtente.Add(" ")
  $hCmbIdUtente.Add(["0", " "]) 
  For Each rHres
     cmbUtente.Add(rHres!utente)
     $hCmbIdUtente.Add([rHres!id_utente, rHres!utente])
  Next
Da quando uso questo metodo non ho avuto più nessun problema.  :ciao:
« Ultima modifica: 11 Dicembre 2015, 11:50:04 da tornu »
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline luca.decarlo

  • Gamberetto
  • *
  • Post: 49
    • Mostra profilo
Re:ComboBox e Indice
« Risposta #2 il: 11 Dicembre 2015, 12:01:37 »
Grazie Tornu,

Mi sembra semplice e rapido ci provo subito!!


Luca

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re:ComboBox e Indice
« Risposta #3 il: 12 Dicembre 2015, 00:08:18 »
Un altro sistema potrebbe essere quello di riunire Nome_utente e Id_utente in un'unica stringa come, pe es.: IdUtente - NomeUtente, oppure NomeUtente - IdUtente, a seconda di come ti convenga.ed aggiungere nella ComboBox la stringa ottenuta. Detto metodo ti permetterebbe di evitare un array in memoria in aggiunta alla List della ComboBox, ed inoltre avresti la possibilità di disporre a vista anche dell'Id utente. Di contro dovresti gestirti di volta in volta la costruzione e la divisione della stringa.
Scusami se non riporto alcun codice di esempio, a causa dell'ora tarda, ma ritengo comunque che tu non abbia bisogno di ulteriori delucidazioni pratiche.
Facci sapere quale metodo risulta più adatto alle tue necessità e in caso di ulteriori dubbi o chiarimenti torna a chiedere tranquillamente.
 :ciao:
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:ComboBox e Indice
« Risposta #4 il: 12 Dicembre 2015, 00:45:00 »
Anche il suggerimento di Picavbg è interessante. Volendo, nel ComboBox puoi sia mostrare Id e nome_Utente, sia solo uno dei due, ed utilizzare comunque anche l'altro.

Faccio un esempio pratico:
Codice: [Seleziona]
Public Sub Form_Open()

' Un ComboBox comprensivo in ciascun suo elemento sia dell'ID che del nome dell'utente:
  ComboBox1.List = ["001 utente1", "002 utente2", "003 utente3", "004 utente4"]      ' ......etc
 
End


Public Sub ComboBox1_Click()

' Nel ComboBox mostriamo esclusivamente il nome dell'utente scelto:
  ComboBox1.Text = Scan(ComboBox1.Current.Text, "* *")[1]
 
' ...ma utilizziamo comunque, ad esempio in una Label, il numero identificativo dell'utente prescelto:
  Label1.Text = Scan(ComboBox1.Current.Text, "* *")[0]

End
« Ultima modifica: 12 Dicembre 2015, 00:47:08 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:ComboBox e Indice
« Risposta #5 il: 12 Dicembre 2015, 01:54:04 »
Ciao vuott,
avevo provato anche io, peraltro senza riuscirci, a fare qualcosa del genere ispirato da un tuo precedente post.
Anche il tuo però a me non funziona pienamente, vale a dire che la combo in partenza mostra anche i codici, solo dopo il click mostra il solo utente.
Il popup mostra sempre tutto, codice e utente.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re:ComboBox e Indice
« Risposta #6 il: 12 Dicembre 2015, 15:20:37 »
Ciao vuott,
la combo in partenza mostra anche i codici, solo dopo il click mostra il solo utente.
Il popup mostra sempre tutto, codice e utente.
La riga visualizzata nella ComboBox.Text è sempre la prima riga della List e contiene perciò tutta la stringa. Se ciascuna riga della List contiene sia il codice Id che il nome utente, essa dovrà ritrovarsi interamente nella ConboBox.Text. Qualora però si volesse rappresentare una riga diversa dalla prima, si può sempre agire da programma, all'interno della procedura gotfocus, trasferendo la riga desiderata nel Text della ComboBox.
Poi c'è da considerare anche il momento in cui viene caricata la ComboBox.List. Per essere disponibile e rappresentabuile nella ComboBox.Text, deve essere caricata prima di renderla disponibile alla digitazione, cioè, come solitamente si fa, nella procedura gotfocus, altrimenti la ComboBox.Text comparirà vuota.
:ciao:

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:ComboBox e Indice
« Risposta #7 il: 12 Dicembre 2015, 16:34:10 »
Non necessariamente la combo mostra la prima riga o niente, puoi mostrare quello che vuoi ad esempio nel codice di vuott:

Codice: [Seleziona]
Public Sub Form_Open()

' Un ComboBox comprensivo in ciascun suo elemento sia dell'ID che del nome dell'utente:
  ComboBox1.List = ["001 utente1", "002 utente2", "003 utente3", "004 utente4"]      ' ......etc
  ComboBox1.Text = Scan("003 utente3", "* *")[1]
  ' Questo se vuoi mostrare anche il codice
  ' ComboBox1_Click
 
End

Il codice di Tornu io lo cambierei così per poter usufruire dei metodi offerti dalle combo ad esempio l'ordine alfabetico:

Codice: [Seleziona]
Private $hCmbIdUtente As New Object[]
Private $hUtente As New String[]

Public Sub Form_Open()
 
  Dim i As Integer
  Dim id, ut As String
 
  ' ' Questo in open non serve
  ' cmbUtente.Clear()
  ' $hCmbIdUtente.Clear()
  ' $hUtente.Clear
  For i = 0 To 9
    id = CStr(100 + i)
    ut = "Utente_" & CStr(i)
    $hUtente.Add(ut)
    $hCmbIdUtente.Add([id, ut])
  Next
 
  $hCmbIdUtente.Reverse
  $hUtente.Reverse
  cmbUtente.list = $hUtente 

End

Public Sub cmbUtente_Click()
  Print $hCmbIdUtente[cmbUtente.Index][0] 
End

OFF TOPIC:
Io chiederei a Leo di togliere questa formattazione del codice che non vale una cicca. Cosa ne dite?
 :ciao:
« Ultima modifica: 12 Dicembre 2015, 16:35:23 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline tornu

  • Gran Maestro dei Gamberi
  • *****
  • Post: 855
    • Mostra profilo
Re:ComboBox e Indice
« Risposta #8 il: 12 Dicembre 2015, 20:59:30 »
Non necessariamente la combo mostra la prima riga o niente, puoi mostrare quello che vuoi ad esempio nel codice di vuott:
Se popoli la Combo "manualmente" certamente, fai vedere quello che vuoi.

Citazione
Il codice di Tornu io lo cambierei così per poter usufruire dei metodi offerti dalle combo ad esempio l'ordine alfabetico:
Non so a quali metodi ti riferisci, ma per quanto riguarda l'ordinamento, se crei tu la lista l'ordine è obbligatoriamente
quello da te inserito (almeno di metodi a me sconosciuti), se la Combo per esempio viene popolata da dati derivanti da
un database, io l'ordine lo inserisco già in fase di query. La propietà Clear() della Combo e dell'Array nel mio esempio
servono a seconda del contesto in cui la Combo opera.
Il software è come il sesso, è meglio quando è libero. (Linus Torvalds)

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:ComboBox e Indice
« Risposta #9 il: 12 Dicembre 2015, 22:25:47 »
...
Non so a quali metodi ti riferisci, ma per quanto riguarda l'ordinamento, se crei tu la lista l'ordine è obbligatoriamente
quello da te inserito (almeno di metodi a me sconosciuti), se la Combo per esempio viene popolata da dati derivanti da
un database, io l'ordine lo inserisco già in fase di query. La propietà Clear() della Combo e dell'Array nel mio esempio
servono a seconda del contesto in cui la Combo opera.

In effetti ho detto una sciocchezza anzi due, se la combo è popolata da un database è più comodo e corretto caricarla da un'interrogazione pertanto è già ordinata come si conviene e può essere ulteriormente ordinata sempre così.
Ho parlato di metodi offerti dalla Combo ma in effetti intendevo dire dagli Array, però conoscere un ulteriore metodo per manipolare la lista al di fuori del database potrebbe essere utile comunque.
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Picavbg

  • Senatore Gambero
  • ******
  • Post: 1.620
    • Mostra profilo
Re:ComboBox e Indice
« Risposta #10 il: 12 Dicembre 2015, 23:42:18 »
Si, é vero la ComboBox.List si può popolare a piacimento, ma sull'ordine da dare al contenuto della List avete dimenticato o non avete notato che nell'impostazione delle proprietà della ComboBox si può attivare la proprietà "Sorted". Infatti, impostando Sorted=True, la List verrà caricata sempre secondo l'ordine crescente degli elementi che la conterranno, per cui, pur caricando Utente3, Utente5, Utente1, Utente4, Utente2, all'esecuzione del popup della ComboBox, la List mostrerà sempre il suo contenuto nell'ordine seguente: Utente1, Utente2, Utente3, Utente4, Utente5.
Per mantenere l'ordine di caricamento secondo una sequenza manuale, attraverso la lettura del DB, occorrerà impostare la proprietà "Sorted" a False.
Sfruttando detto meccanismo, dopo la preimpostazione della proprietà Sorted a False,  io ho potuto caricare i dati rilevati da una tabella del DB;  alla fine del caricamento, impostando  Sorted=True, ho ottenuto un ordinamento di tipo alfabetico degli elementi già caricati, poi, impostando  Sorted=False ho aggiunto altri elementi, tenendoli così sempre in coda, disordinati rispetto a tutti i precedenti
Codice: [Seleziona]
 For i = 0 To iTotel
                If DescrMoDig.Text < DescrMoDigLst.List[i] Then
                    $DescrUlt = DescrMoDig.Text
                    For n = 1 To 8
'                    Print "DescrMoDigLst.List[" & i_Totel & "]= " & DescrMoDigLst.List[i_Totel]
                       DescrMoDigLst.Remove(iTotel)
                    Next
                     iTotel = DescrMoDigLst.List.Count
                    DescrMoDigLst.Add($DescrUlt)

---->            DescrMoDigLst.sorted = True                                  'Attivo l'ordinamento alfabetico della DescrMoDigLst.List

                    Wait 0.1

---->            DescrMoDigLst.sorted = False                                'Disttivo l'ordinamento nella DescrMoDigLst.List  per accodare gli ultimi elementi nella List

                    InsDescrPreMom        '  popolo la combobox "Descrizione" con le causali di prestito momentaneo
                    iTotel = DescrMoDigLst.List.Count
                    bFatto = True
                    Break
                Else
                  If DescrMoDig.Text = DescrMoDigLst.List[i] Then
                      bFatto = True
                      Break
                  Endif
                Endif
            Next

Spero di essere stato utile.
« Ultima modifica: 12 Dicembre 2015, 23:47:57 da Picavbg »
:ciao:

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.720
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:ComboBox e Indice
« Risposta #11 il: 13 Dicembre 2015, 14:58:30 »
la combo in partenza mostra anche i codici
Questo diventa un problema solo se luca.decarlo non voleva un risultato di quel genere.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »