Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

[vb.net] Come catturare la selezione di una listview?

0 views
Skip to first unread message

Christian

unread,
Mar 7, 2006, 5:55:03 PM3/7/06
to
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

Melchiade Bedrosian Baol

unread,
Mar 8, 2006, 2:57:17 AM3/8/06
to
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


Christian

unread,
Mar 8, 2006, 5:15:59 AM3/8/06
to
Melchiade Bedrosian Baol says...

> Christian ha scritto:
> > 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.
> Capito poco...

Mi spiego meglio: cliccando su una riga di una listview voglio che il
dato selezionato sia caricato su una variabile per utilizzi futuri.

> Hai provato a gestire l'evento SelectedIndexChanged?
> 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

Melchiade Bedrosian Baol

unread,
Mar 8, 2006, 7:19:31 AM3/8/06
to
Christian ha scritto:

> Mi spiego meglio: cliccando su una riga di una listview voglio che il
> dato selezionato sia caricato su una variabile per utilizzi futuri.

Non ne vedo la necessità. La listview permette la selezione multipla degli
elementi, dovrebbe bastarti andare a vedere la ListView.SelectedItems per
sapere quali sono gli elementi selezionati.


> 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.

In realtà dovrebbe darti l'elenco degli indici degli elementi selezionati,
non di tutti gli elementi presenti.

Questo, almeno, a leggere MSDN.

Christian

unread,
Mar 8, 2006, 10:25:04 AM3/8/06
to
Melchiade Bedrosian Baol says...

> Christian ha scritto:
> > Mi spiego meglio: cliccando su una riga di una listview voglio che il
> > dato selezionato sia caricato su una variabile per utilizzi futuri.
> Non ne vedo la necessità. La listview permette la selezione multipla degli
> elementi, dovrebbe bastarti andare a vedere la ListView.SelectedItems per
> sapere quali sono gli elementi selezionati.

Per le mie necessità non ho bisogno di una selezione multipla.
Anch'io pensavo fosse così semplice, ma mi dava errore. Adesso ho
pensato di mettere nell'evento:
listview1_SelectedIndexChanged...
Dim a As ListView.SelectedListViewItemCollection
a = listview1.SelectedItems()

Configurata in questo modo non c'è errore, ma quando faccio girare il
programma ed attivando il debug vedo che, indipendentemente dal numero
di ListViewItem caricati, la prima volta che clicco su un dato mi dà a=
1, mentre dalla seconda volta in poi gira due volte sull'evento che ho
indicato sopra e la prima volta dà a.Count=0 e la seconda a.Count=1,
indipendentemente da quale dato seleziono.
Tieni presente che seleziono sempre un solo dato...

> > 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.
> In realtà dovrebbe darti l'elenco degli indici degli elementi selezionati,
> non di tutti gli elementi presenti.
> 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

Melchiade Bedrosian Baol

unread,
Mar 8, 2006, 10:31:44 AM3/8/06
to
Christian ha scritto:

> Per le mie necessità non ho bisogno di una selezione multipla.
> Anch'io pensavo fosse così semplice, ma mi dava errore. Adesso ho
> pensato di mettere nell'evento:
> listview1_SelectedIndexChanged...
> Dim a As ListView.SelectedListViewItemCollection
> a = listview1.SelectedItems()

> Configurata in questo modo non c'è errore, ma quando faccio girare il
> programma ed attivando il debug vedo che, indipendentemente dal numero
> di ListViewItem caricati, la prima volta che clicco su un dato mi dà a=
> 1, mentre dalla seconda volta in poi gira due volte sull'evento che ho
> indicato sopra e la prima volta dà a.Count=0 e la seconda a.Count=1,
> indipendentemente da quale dato seleziono.
> 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

Christian

unread,
Mar 8, 2006, 11:12:18 AM3/8/06
to
Melchiade Bedrosian Baol says...

> Christian ha scritto:
> > Per le mie necessità non ho bisogno di una selezione multipla.
> > Anch'io pensavo fosse così semplice, ma mi dava errore. Adesso ho
> > pensato di mettere nell'evento:
> > listview1_SelectedIndexChanged...
> > Dim a As ListView.SelectedListViewItemCollection
> > a = listview1.SelectedItems()
> > Configurata in questo modo non c'è errore, ma quando faccio girare il
> > programma ed attivando il debug vedo che, indipendentemente dal numero
> > di ListViewItem caricati, la prima volta che clicco su un dato mi dà a=
> > 1, mentre dalla seconda volta in poi gira due volte sull'evento che ho
> > indicato sopra e la prima volta dà a.Count=0 e la seconda a.Count=1,
> > indipendentemente da quale dato seleziono.
> > 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...

Ops, mi sa che hai ragione.
Ma questo non giustifica il fatto che nella prima selezione mi fa un
giro dell'evento e dalla seconda in poi ne fa due con una selezione
singola.

> 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

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

Melchiade Bedrosian Baol

unread,
Mar 9, 2006, 2:50:41 AM3/9/06
to
Christian ha scritto:

> Ops, mi sa che hai ragione.

E' vero. Qualche volta succede

> Ma questo non giustifica il fatto che nella prima selezione mi fa un
> giro dell'evento e dalla seconda in poi ne fa due con una selezione
> singola.

E invece, se ci pensi, è logico. La prima volta parti da una situazione di
"nessuna selezione", selezionando un elemento hai solo un evento; la
seconda parti da una selezione presente, per selezionare un altro elemento
deselezioni in automatico il precedente, quindi le variazioni alla lista
dei selezionati sono due (e difatti il primo evento ha un conteggio di
elementi selezionati pari a 0)
Può sembrare ridondante, ma meglio troppo che niente.

> Item <cannot view idexed property> System.Windows...

In debug non riesci a vederlo in questo modo, ma da codice hai accesso a
tutte le proprietà dell'oggetto

> In teoria mi dovrebbe dare un solo ciclo con indicato il
> 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

Christian

unread,
Mar 9, 2006, 4:14:23 AM3/9/06
to
Melchiade Bedrosian Baol says...
> Christian ha scritto:
> > Ma questo non giustifica il fatto che nella prima selezione mi fa un
> > giro dell'evento e dalla seconda in poi ne fa due con una selezione
> > singola.
> E invece, se ci pensi, è logico. La prima volta parti da una situazione di
> "nessuna selezione", selezionando un elemento hai solo un evento; la
> seconda parti da una selezione presente, per selezionare un altro elemento
> deselezioni in automatico il precedente, quindi le variazioni alla lista
> dei selezionati sono due (e difatti il primo evento ha un conteggio di
> elementi selezionati pari a 0)
> Può sembrare ridondante, ma meglio troppo che niente.

Ieri sera mi sono guardato bene tutto ed hai proprio ragione, infatti se
ne seleziono tre e poi solo uno, prima va a ritroso deselezionando tutti
e tre (count=2, count=1, count=0) e poi seleziona count=1.

> > Item <cannot view idexed property> System.Windows...
> In debug non riesci a vederlo in questo modo, ma da codice hai accesso a
> tutte le proprietà dell'oggetto

Capito.

> > In teoria mi dovrebbe dare un solo ciclo con indicato il
> > 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.

No no, niente fastidio.

Io pensavo di prendere il valore indicato dalla selezione e farmi il
miei lavoretti, ma qui bisogna prelevarlo in altro modo. Su MSDN
indicano Contains e IndexOf ma ho qualche difficoltà con la giusta
sintassi: mi dai una mano?

> Comunque leggendo quello che vuoi fare, mi sembrerebbe più adatto
> utilizzare la listview in multiselection

É ancora in multiselection.

Christian

Melchiade Bedrosian Baol

unread,
Mar 9, 2006, 4:27:23 AM3/9/06
to
Christian ha scritto:
> É 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?

Christian

unread,
Mar 9, 2006, 4:40:25 AM3/9/06
to
Melchiade Bedrosian Baol says...

> Christian ha scritto:
> > É ancora in multiselection.
> Ah...
> Avevo capito il contrario.

Nella fretta di scrivere non ho scritto tutto: è ancora in
multiselection per fare le prove, ma nella versione finale sarà
multiselect=false.

> 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?

Hai capito bene, ho difficoltà a scrivere il codice corretto per leggere
la selezione dell'utente.

Christian

Melchiade Bedrosian Baol

unread,
Mar 9, 2006, 5:04:47 AM3/9/06
to
Christian ha scritto:

> ho difficoltà a scrivere il codice corretto per leggere
> 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.

Christian

unread,
Mar 9, 2006, 5:17:53 AM3/9/06
to
Melchiade Bedrosian Baol says...

> Christian ha scritto:
> > ho difficoltà a scrivere il codice corretto per leggere
> > 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.

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

Melchiade Bedrosian Baol

unread,
Mar 9, 2006, 5:28:14 AM3/9/06
to
Christian ha scritto:

> 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.

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

Christian

unread,
Mar 9, 2006, 6:24:19 AM3/9/06
to
Melchiade Bedrosian Baol says...

> Christian ha scritto:
> > 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.
> Mi ripeto...
> 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

Melchiade Bedrosian Baol

unread,
Mar 9, 2006, 7:28:51 AM3/9/06
to
Christian ha scritto:

> Il codice per identificare la selezione dell'utente.
> 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.

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

Christian

unread,
Mar 9, 2006, 9:38:37 AM3/9/06
to
Melchiade Bedrosian Baol says...

> Christian ha scritto:
> > Il codice per identificare la selezione dell'utente.
> > 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.
>
> 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 :-)

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

Melchiade Bedrosian Baol

unread,
Mar 9, 2006, 10:39:06 AM3/9/06
to
Christian ha scritto:

> 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?

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.

Christian

unread,
Mar 9, 2006, 11:13:55 AM3/9/06
to
Melchiade Bedrosian Baol says...

> Christian ha scritto:
> > 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?
> 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.

Se fosse cosě, io non l'ho visto, magari se ci dai un'occhiata me lo
confermi.

Christian

Melchiade Bedrosian Baol

unread,
Mar 10, 2006, 8:05:39 AM3/10/06
to
Christian ha scritto:
> Se fosse così, io non l'ho visto, magari se ci dai un'occhiata me lo
> 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

Christian

unread,
Mar 10, 2006, 9:32:35 AM3/10/06
to
Melchiade Bedrosian Baol says...

> Christian ha scritto:
> > Se fosse così, io non l'ho visto, magari se ci dai un'occhiata me lo
> > 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

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

0 new messages