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:
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
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
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"
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:
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:
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
Non necessariamente la combo mostra la prima riga o niente, puoi mostrare quello che vuoi ad esempio nel codice di vuott:
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:
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:
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
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.