Newsgroup: it.comp.lang.visual-basic
Titolo: Posizionarsi dentro una ComboBox

Ciao all!
E' una vita che non posto... si vede che di problemi ce en sono stati anche
troppi :|
CMQ riposto dopo tanto che non metto mani al VB con i miei soliti dilemmi
con le combo box :)
Ho una combobox di nome cmb_X (per semplificare) nella quale ho dei dati,
ora il mio problema e' spostarmi dentro la combo box da codice
posizionandomi su di un particolare elemento che abbia l'itemdata uguale ad
un valore ttirato fuori da una query.
Vedo di spiegarmi con un po' di codice :)
    Rs.Open "Select * From tabella order by campo;", ado_Conn,
adOpenDynamic, adLockOptimistic
    With cmb_X
        .AddItem "Seleziona"
        .ItemData(.NewIndex) = 0
        Do While Not Rs.EOF
            .AddItem Rs.Fields("desc")
            .ItemData(.NewIndex) = Rs.Fields("id")
            Rs.MoveNext
        Loop
        .ListIndex = 0
    End With
    Rs.Close
alla fine mi trovero' una combobox cosi' caricata:
Index - Item - ItemData
0 - Seleziona - 0
1 - primo - 34
2 - secondo -55
3 - terzo -1234
4 - zazaaaa! - 2
Fino a qui tutto ok, item contiene la descrizione della query e itemdata
l'id della descrizione.
Ora nasce un problema, di base con il ListIndex=0 mi posiziono sulla
descrizione "seleziona" ma questo non mi basta...
Ora devo fare qualcosa di simile ma al contrario.
Avendo l'elenco della combobox devo posizionarmi (tramite codice) in un
punto della combobox usando l'itemdata.
Mi spiego, ho una query che mi ritorna un numero (ID), avendo questo ID devo
posizionare come selezionato la combo box, tipo:
str_query = select * from tabella where desc='terzo';
Ora che la query e' stata effettuata, ho l'ID = 1234 e devo riposizionare il
combobox, come faccio con listindex, ma anziche' usare l'index della
combobox, devo usare l'itemdata.
Soluzioni? ^^
Ciao ;^)=
-- 
RedFoxy
A fox around web
Power at fox for a yiffing world!

 combobox, devo usare l'itemdata.
Fai un ciclo for sull'indice degli elementi della combobox , e ne controlli
di volta in volta l'itemdata.
                Ciao
                        Zephiross

 E' una vita che non posto...
e, come sempre, poco prima del meeting.
vabbè le coincidenze, ma tre su tre incomincia ad essere una regola ;-)
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

Soluzione un peletto più dispendiosa,usi una collection. Pari indice
di collection cmb_x.listindex = Z
Oppure se eventi esterni non aggiungono dati alla tua combo
cmb_x.listindex = RS.recordcount -1
-- 
Saluti
Andrea Moro

 controlli di volta in volta l'itemdata.
Soluzione troppo dispendiosa...  mi ritroverei alla fine con cicli immani


 ;-)
Tanto non vengo... non sono piu' a milano... ho avuto tanti di quei casini e
ne ho ancora che nemmeno ti immagini................. E poi che e'? ti
dispiacer la mia presenza nei meeting? :P


 cmb_x.listindex = RS.recordcount -1
Scusa, non afferro il tuo suggerimento...
No la combo non viene modificata esternamente, e se in caso viene modificata
(da una seconda form) viene resettata sempre da quella form


 modificata (da una seconda form) viene resettata sempre da quella form
Beh, credo che intendesse dire:
    cmb_x.listindex = RS.AbsolutePosition -1
poichè l'indice della combo parte da 0 mentre il valore di AbsolutePosition
parte da 1. Quindi se carichi la combo e poi nessuno modifica i dati avrai
sempre tale corrispondenza
ciaociao

 immani
ma, afaik, l'unica.
voltala e pirlala fin che vuoi, devi sapere quale è "l'indice" di un item
dato il suo "itemdata". l'unica è scorrerli tutti.
--


 modifica i dati avrai sempre tale corrispondenza
Nel tuo caso credo che tu stia prendendo in considerazione l'ordine in cui
viene presentato il recordset o sbaglio?
Ma Moro parlava di altro forse, visto che ha scritto recordcount e paralva
di collection...
Il discorso di usare l'absoluteposition non e' cattiva ma forse inutile...
PErche' il risoltato per posizionarmi dentro la combobox lo ricevo d una
query che mi restituisce un solo record (o nessuno se non lo trova), percio'
avremmo sempre cmb_x.listindex = 0, percio' sempre su "seleziona".
Se invece ho cannato a capire quello che intendevi, scusa... mi spiegheresti
meglio? :)


 item dato il suo "itemdata". l'unica è scorrerli tutti.
Vero, ma chissa' magari c'era un opzione che ti permetteva di usare
l'itemdata come index o magari qualche furbata che ti permetteva di fare
altro...
Ci ho provato... Usare i cicli frega parecchio tempo quando si riempono le
cmb :|


 spiegheresti meglio? :)
capito? ;-)

 cmb :|
Puo' essere, ma quanti elementi hai caricato?!?
Un ciclo for in lettura su 10.000 elementi, come questo
For i = 0 To Combo1.ListCount - 1
    If Combo1.ItemData(i) = Combo1.ListCount Then Combo1.ListIndex = i
Next
impiega circa 30 millisecondi su un Athlon XP 1400+; ora facciamo pure le
debite proporzioni con un processore piu' vecchio, non credo possa impiegare
piu' di mezzo secondo.
Il punto pero' e' un altro: un combo con piu' di qualche centinaio di
elementi tende ad essere alquanto "user unfriendly", quindi ammesso che tu
debba trattare questa mole di dati, personalmente rivedrei un po'
l'approccio...
Ad ogni modo, le "furbate" per usare l'ItemData senza cicli puoi creartele
da solo con poco sforzo; la prima cosa che mi viene in mente e' questa:
'A Livello di form
Private LookUpTable As Collection
'in fase di caricamento
Dim i As Long
Dim ItmData As Long
Set LookUpTable = New Collection
For i = 1 To 10000
    Combo1.AddItem "Item #" & i
    ItmData = i * 2 'un ipotetico valore
    Combo1.ItemData(Combo1.NewIndex) = ItmData
    'usiamo l'indice come valore e l'itemdata come chiave della
    'collection, aggiungendo un prefisso alfabetico costante
    '(la collection non supporta key numeriche)
    LookUpTable.Add Combo1.NewIndex, "K_" & ItmData
Next
a questo punto, dato un valore di ItemData noto, per accedere all'indice e'
sufficiente
Dim v As Variant
v = LookUpTable("K_8524")
Combo1.ListIndex = CLng(v)
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown