Newsgroup: it.comp.lang.visual-basic
Titolo: [vb.net] Come catturare la selezione di una listview?

Ho una listview popolata con dei dati e vorrei catturare su una 
variabile l'evento del click col mouse sulla riga per la selezione di 
una riga (impostazione FullRowSelect=True e View=Details), le ho provate 
tutte, ma non trovo l'impostazione corretta.
Christian

Christian ha scritto:

Capito poco...
Hai provato a gestire l'evento SelectedIndexChanged?
http://tinyurl.com/o8nhw
-- 
Salutoni
Sergio
..Nessun baol esiste.
Non sei mai esistito, Baol, se non nei nostri sogni.
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 
http://tinyurl.com/o8nhw
Si.
Ho inserito questo nella Sub dell'evento:
Dim indexes As ListView.SelectedIndexCollection = _
Me.ListView1.SelectedIndices
Purtroppo non funziona bene, più di 0 ed 1 non dà, anche se inserisco 
molti dati: in teoria mi dovrebbe dare 0 per il primo dato, 1 per il 
secondo, 2 per il terzo ecc.
Christian

 secondo, 2 per il terzo ecc.
In realtà dovrebbe darti l'elenco degli indici degli elementi selezionati,
non di tutti gli elementi presenti.
Questo, almeno, a leggere MSDN.


 Questo, almeno, a leggere MSDN.
... se invece seleziono due dati contemporaneamente mi dà a.Count=2, ma 
non indica quali selezioni ho fatto.
Dopo, riselezionando un solo dato, mi gira ben 3 volte l'evento, con 
a.Count=1 la prima volta, a.Count=0 la seconda, a.Count=1 la terza.
Christian

 Tieni presente che seleziono sempre un solo dato...
ehm...
Quando leggo queste cose vado un attimo in confusione...
a.count è il "conteggio" di quanti elementi sono selezionati, è ovvio che
se ne selezioni uno, a.count sia 1 a prescindere da quale sia l'elemento
selezionato...
Se vuoi sapere qual è l'elemento selezionato devi guardare cosa c'è in
a.item(0) (per il primo elemento selezionato) e così via.
O qualcosa del genere, perchè questa volta non sono andato a vedere su MSDN


 O qualcosa del genere, perchè questa volta non sono andato a vedere su MSDN
Ti dico quello che mi dà la prima volta che seleziono qualcosa dalla 
listview:
Nome         Valore                              Tipo
a            System.Windows.Forms.ListView...    System.Windows...
Count        1                                   Integer
IsReadOnly   True                                Boolean
Item         <cannot view idexed property>       System.Windows...
Dalla seconda volta in poi cambia solo Count e mi dà 0 ed 1 nei due 
cicli che fa. In teoria mi dovrebbe dare un solo ciclo con indicato il 
valore in Item, poi lo prelievo e lo uso per altri utilizzi, no?
Ti dò un'ulteriore informazione, lo schema che ti ho fatto è uguale 
anche per un'altra variabile indicata così:
Dim b As ListView.SelectedIndexCollection = 
Me.listiview1.SelectedIndices
Christian

 valore in Item, poi lo prelievo e lo uso per altri utilizzi, no?
Vedi sopra. Se ti da fastidio il fatto di essere informato della
deselezione, effettua immediatamente un controllo sul count, e se è a zero
esci dalla sub senza fare nulla.
Comunque leggendo quello che vuoi fare, mi sembrerebbe più adatto
utilizzare la listview in multiselection


 utilizzare la listview in multiselection
É ancora in multiselection.
Christian

 É ancora in multiselection.
Ah...
Avevo capito il contrario.
A questo punto, che te ne fai di sapere chi cosa dove quando viene
selezionato/deselezionato?
Lasci fare all'operatore, e quando ti serve vai a leggere la collection
degli item selezionati, senza intercettare ogni variazione.
O ho capito male di nuovo?


 O ho capito male di nuovo?
Hai capito bene, ho difficoltà a scrivere il codice corretto per leggere 
la selezione dell'utente.
Christian

 la selezione dell'utente.
come già detto, gli elementi selezionati sono in ListView.SelectedItems 
qui c'è il link a msdn con un esempio di come utilizzare questa proprietà
http://tinyurl.com/kx8xc
Altro non saprei dirti, perchè non l'ho mai usato, per ulteriori aiuti
dovresti specificare meglio le difficoltà che incontri.


 dovresti specificare meglio le difficoltà che incontri.
Ho già letto il link per bene, ma purtroppo non riesco a scrivere il 
codice corretto per individuare la selezione dell'utente, per questo 
chiedevo aiuto.
Christian

 chiedevo aiuto.
Mi ripeto...
Cosa vuol dire che non riesci a "scrivere il codice corretto"?


 Cosa vuol dire che non riesci a "scrivere il codice corretto"?
Il codice per identificare la selezione dell'utente.
Come ben sai (l'ho indicato in uno dei messaggi precedenti), vb cattura 
la selezione dell'utente, ma la segna come <cannot view indexed 
property> e quindi bisogna scrivere del codice che lo identifichi 
all'interno della lista nella listview.
Christian

 all'interno della lista nella listview.
Boh...
La collezione di cui stiamo parlando contiene gli elementi selezionati, e
questi sono oggetti dello stesso tipo di di quelli che hai inserito nel
controllo. Come fare a capire quali sono dipende da cosa ci hai messo :-)
-- 
Salutoni
Sergio
That's me in the corner
That's me in the spotlight
Losing my religion
Trying to keep up with you
And I don't know if I can do it
Oh no I've said too much
I haven't said enough


 controllo. Come fare a capire quali sono dipende da cosa ci hai messo :-)
Ci ho messo dati di un array, ma lo sto trasformando in arraylist.
Però, dal basso della mia conoscenza della listview, non credo che 
c'entri la fonte dati con la quale si riempie la listview: può derivare 
da variabile, da inserimento manuale, da array, arraylist, hashtable, 
queue o quant'altro.
Se non sbaglio una volta caricati i dati su listview, questi non mi 
dicono da quale fonte dati provengono, ma vengono visti come 
System.Windows.Forms.Listview..., quindi come tali vanno trattati e 
maneggiati.
Dico bene?
Christian

 Dico bene?
E' probabile.
Ma da quello che ho visto della filosofia ".net", mi stupirei non poco se
nell'oggetto listviewitem (o come diavolo si chiama) non fosse presente un
riferimento all'oggetto di partenza.


 riferimento all'oggetto di partenza.
Se fosse cosě, io non l'ho visto, magari se ci dai un'occhiata me lo 
confermi.
Christian

 confermi.
Effettivamente, nelle proprietà del listview item non c'è nulla che si
riferisca esplicitamente alla fonte dati da te utilizzata. Direi che a
questo punto hai davanti a te due strade
a) Inserisci gli item nella lista con lo stesso ordine presente nella tua
fonte dati, in questo caso la proprietà index del listviewitem ti dovrebbe
aiutare a ritrovare l'oggetto originario
b) Inserisci nella proprietà Tag del listviewitem un riferimento al tuo
oggetto.
Opterei per la seconda
hth


 Opterei per la seconda
Ti ringrazio molto del tuo interessamento, ma è tutta la mattina che mi 
scervello e, grazie al tuo link su MSDN, nel cercare di capire perchè 
l'esempio lì indicato funziona, ho trovato la soluzione.
La chiave è nell'ultima parte dell'esempio, purtroppo i giorni scorsi 
non gli ho dato la giusta importanza, oggi però gli ho dedicato tutta la 
mia attenzione e sono riuscito a farlo funzionare, ovviamente con i 
dovuti cambiamenti (per esempio ho dovuto riscrivere la riga dentro il 
ciclo for each).
Ora ho la mia variabile con il dato che mi serve.     ;-)
Spero che il mio invito a documentarti per chiarirmi i dubbi abbia 
arricchito anche te, in ogni caso grazie.
Christian