Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6]Sapere se in una combo box esiste già un valore!!

Salve a tutti, dovendo arricchire una combo con dati prelevati da un data 
base, come posso fare a verificare se una voce è stata già inserita nella 
combobox stessa???
Grazie a tutti
Alberto 

alma ha scritto:

Se la combo è Bound con un Adodc(o l'equivalente DAO che non uso da
tempo immemore) puoi fare la ricerca nel Recordset usando Find....
Se è Unbound allora devi iterare gli Items.
@Alex

 @Alex
In tutti i casi SendMessage + CB_FINDSTRING sono più veloci di qualunque loop.
http://www.devx.com/vb2themax/Tip/19121
Bye
Raf
-----------------------------------------------------
Funk: cooler than the other side of the pillow.

 Raf
Assolutamente vero, non ci avevo nemmeno pensato...!
Tnx
@Alex

 
http://www.devx.com/vb2themax/Tip/19121
Si, ma esiste anche un trucco per cercare l'ItemData? Una specie di
CB_FINDITEMDATA?
Dopo qualche giorno di ricerca e di tentativi non ho trovato nulla in
proposito. Io ho diverse combo che mostrano una voce da una tabella di
lookup, ma scrivono l'ID della voce nel campo della tabella principale: se
memorizzassi i nomi c'č l'API SendMessage, ma memorizzando l'ItemData devo
fare il loop. O c'č una scorciatoia?
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 fare il loop. O c'è una scorciatoia?
Non sono riuscito a capire il problema... scusa ma sarà la Befana...!
Stiamo sempre parlando del 3D originale...?
@Alex

 Stiamo sempre parlando del 3D originale...?
Si, il concetto è quello di base. Devo cercare un valore in una combo. Con
la SendMessage + CB_FINDSTRING trovo subito il valore, cercandone il testo
tra gli item. Cioè se cerco "Roma" posso trovarlo velocemente senza un
ciclo.
Ammettiamo però che io nel campo Città non ho memorizzato il nome ma l'ID di
Roma, che nella combo è memorizzato nella proprietà ItemData.
Private Sub Form_Load()
    Riempi_Elenco_Città
    Carica_Dati
End Sub
Private Sub Riempi_Elenco_Città()
    Dim rs As ADODB.Recordset
    Dim sql As String
    Set rs = New ADODB.Recordset
    sql = "SELECT IDCittà, NomeCittà FROM Città ORDER BY Città;"
    rs.Open sql, cn, adOpenForwardOnly, adLockReadOnly, adCmdText
    Do While Not rs.EOF
        cboCittà.AddItem rs.Fields("NomeCittà").Value & ""
        cboCittà.ItemData(cboCittà.ListIndex) = rs.Fields("IDCittà").Value
    Loop
    rs.Close
    Set rs = Nothing
End Sub
Private Sub Carica_Dati()
    Dim rs As ADODB.Recordset
    Dim sql As String
    Dim i As Long
    Set rs = New ADODB.Recordset
    sql = "SELECT * FROM Amici ORDER BY Cognome;"
    rs.Open sql, cn, adOpenForwardOnly, adLockReadOnly, adCmdText
    rs.MoveFirst
    ' riempie i campi con i dati del recordset
    txtNome.Text = rs.Fields("Nome").Value & ""
    txtCognome.Text = rs.Fields("Cognome").Value & ""
    txtIndirizzo.Text = rs.Fields("Indirizzo").Value & ""
    txtTelefono.Text = rs.Fields("Telefono").Value & ""
    ' ============== Questo è il ciclo che vorrei evitare ===============
    ' === (se il campo CittàAmico contenesse il nome della città invece ====
    ' === che l'IDCittà, utilizzerei la SendMessage con CB_FINDSTRING) ===
    For i = 0 to cboCittà.ListCount - 1
        if cboCittà.ItemData(i) = rs.Fields("CittàAmico").Value Then
            cboCittà.ListIndex = i
            Exit For
        End If
    Next i
    [... altro codice...]
End Sub
Capito? Domanda: devo per forza fare un ciclo, come sto facendo al momento?


yronium ha scritto:

Purtroppo, da quanto ne so, con VB6 credo di si....
In Access avresti potuto farlo in modo molto più elegante(in questo
caso)...!
Sai che con A2002 Combo e List supportano la proprietà Recordset,
quindi le puoi popolare
sbattendogli direttamente un RS(anche ADO se aperto dal provider OLE),
quindi usando il metodo Find avresti potuto fare la ricerca....
In VB sinceramente penso che se ti tieni aperto il RS tu possa fare
altrettanto, non sò quanto sia veloce.... ma potrebbe non essere male
rispetto al ciclo..., certo devi tenere un RS aperto...
@Alex

yronium ha scritto:

Purtroppo, da quanto ne so, con VB6 credo di si....(nel senso del
ciclo)


 memorizzando l'ItemData devo fare il loop. O c'è una scorciatoia?
Purtroppo AFAIK non esiste un CB_FINDITEMDATA... si deve andare di ciclo For
obbligatoriamente.


 rispetto al ciclo..., certo devi tenere un RS aperto...
Solito discorso: ne dovrei tenere aperti troppi.
Bah, grazie comunque per l'aiuto.


 obbligatoriamente.
Già, io mi ci sono scraniato per una settimana.
Che triste, però: uno memorizza l'ID in un campo per velocizzare le ricerche
nella tabella, ed avere un db più efficiente, poi utilizza la proprietà
ItemData che è fatta apposta per contenere quell'ID.... e alla fine è
costretto a cercare i valori con un ciclo!. Se uno invece progetta male il
db, memorizzando il testo e senza tabelle di lookup, sprecando 50 o 100 byte
per record solo per memorizzare il Comune di nascita... con una combo e
un'API la ricerca è velocissima.
Non c'è giustizia a qs. mondo...


 Non c'è giustizia a qs. mondo...
ROTFL !
