Newsgroup: it.comp.lang.visual-basic
Titolo: [vb.net] Lettura dati Listview - hashtable

Ho una Hashtable su cui carico i dati ed una listview (ma in futuro 
anche altro) su cui li visualizzo (per chi ha seguito vecchi messaggi 
qualche settimana fa, ho adottato una soluzione per cui dovrei aver 
risolto tutti i vecchi problemi legati alla visualizzazione ed alla 
cancellazione).
Ora ho qualche difficoltà a "coordinare" i dati su hashtable e su 
listview quando cancello dei record su hashtable, questo perchè 
SelectIndexChanged (multiselect = false) della listview restituisce un 
valore legato all'ordine di visualizzazione su listview, ignorando 
giustamente la chiave su hashtable, che viene riempita con un contatore 
ad incremento unitario, quindi in caso di cancellazione i due valori 
sballano.
Per chiarire meglio la questione faccio un esempio: i primi 5 dati di 
una listview hanno come valore 0, 1, 2, 3 e 4 ed anche i primi 5 record 
della hashtable hanno come chiave 0, 1, 2, 3 e 4, quindi la 
coordinazione è perfetta.
Nel caso in cui si cancelli per esempio i record 1 e 4 e s'inseriscano 
altri due nuovi record, le chiavi della hashtable saranno 0, 2, 3, 5 e 6 
e la coordinazione con la listview che rimane 0, 1, 2, 3 e 4 va a farsi 
benedire.
Per risolvere questo problema ho pensato che al momento della selezione 
di un record su listview il programma si vada a leggere l'esatto valore 
della chiave memorizzata su hashtable.
Per fare questo questo ho pensato ad una soluzione "particolare", 
ovverossia al momento del caricamento della listview da hashtable 
tramite ciclo for vorrei creare una matrice unidimensionale in cui 
inserire ad ogni ciclo il valore della chiave, quindi quando si va a 
leggere il SelectIndexChanged si può sapere senza problemi qual'è la 
chiave del record selezionato.
Si può leggere tranquillamente perchè se nell'esempio di prima ho come 
chiavi di hashtable 0, 2, 3, 5 e 6 saranno inseriti così:
Dim mat() As Integer
...
For i As Integer = 0 To Hash.Count - 1
...
mat(i) = Record.id      'Record.id è il valore della chiave
Next
Si avrà quindi:
(0) = 0
(1) = 2
(2) = 3
(3) = 5
(4) = 6
Leggendo con SelectIndexChanged il valore della listview si può 
facilmente arrivare alla chiave della hashtable.
Questo però farà giustamente rabbrividire i puristi e hanno anche 
ragione, prima di tutto perchè non è una soluzione elegante e poi è poco 
performante. Il problema dell'occupazione di memoria è facilmente 
risolvibile cancellando la matrice a fine ciclo for.
Per questi motivi tengo la soluzione esposta come "piano di riserva" e 
vorrei sapere se c'è una soluzione migliore.
Ho scritto poco codice per rendere questo post più leggero da leggere, 
ma se serve lo farò senza problemi. Se ci fosse qualcosa di poco chiaro 
non esitate a dirlo, grazie.
Christian

 ha scritto nel messaggio 
news:MPG.1ecbc7e29...@news.tin.it...


 chiave della lista.
Buona idea, mi sono studiato la proprietā tag e mi sembra che faccia al 
caso mio, ma ho qualche problema ad implementarla. Butto gių due righe 
di codice per spiegare il problemino.
For i As Integer = 0 To Hash.Count - 1
'assegna alla listview tutti i dati della Hashtable
...
lvi.Tag = Record.id
'lvi č una nuova istanza di listviewitem
'Record.id č la chiave dell'hashtable
ListView1.Items.Add(lvi)
Next
Cosė facendo assegno il tag correttamente, ma se ci sono per esempio due 
record nell'hashtable al secondo ciclo for toglie il tag di valore "0" 
per assegnare quello di valore "1" invece a me serve che per ogni riga 
di listview venga assegnato un diverso tag, corrispondente alla chiave 
della hashtable.
Consigli su come farlo?
Christian

 Next

 ha due campi, chiave e valore (oggetto), la chiave non può cambiare.
Che io sappia la differenza tra SortedList e Hashtable è una maggiore 
flessibilità in sede di ordinamento della SortedList a scapito di 
prestazioni inferiori. Alla luce di questo ti chiedo di dirmi perchè è 
preferibile utilizzare una SortedList visto che al momento non ho 
necessità di ordinamenti gravosi.
Invece sono interessato ad avere un'indicazione su come utilizzare al 
meglio il tag della ListView per la mia necessità di avere 
l'attribuzione di ogni riga della ListView alla chiave della HashTable 
corrispondente.
Christian