Newsgroup: it.comp.lang.visual-basic
Titolo: ListView - Velocizzare il caricamento degli item

Salve a tutti,
devo caricare numerosi Item in una listview (2000-3000 con una decina
di colonne). Qualcuno sa indicarmi una strada per per velocizzare il
caricamento o almeno fare in modo che all'utente il caricamento sembri
più rapido. Su un computer non di ultimissima generazione (PII)
l'operazione impiega anche una decina di secondi.
Grazie
LT

LT wrote:

Sul tempo necessario non puoi farci nulla, ma quanto meno potresti inserire 
un "doevents" nella routine di inserimento per lasciare comunque il 
controllo del programma e non far sembrare il programma bloccato.
Ciao,
        Fabrizio

osservazione generale: molto spesso non è la velocità quella che si dovrebbe
cercare, quanto la velocità "percepita" dall'utente.....
in altre parole, come ti ha detto Negus, se il tempo è quello, non puoi
farci nulla. Ti consiglio di usare un form, con una progress-bar, una
doevents nel ciclo che carica la listview. Durante il caricamento, la
progress-bar tiene buono l'utente, vede che il programma sta facendo
qualcosa.....
ti conviene fare così.......
good coding!!!
-- 
Damiani Liborio Igor
ig...@igordamiani.it
 - 
soft...@igordamiani.it
 - 
idam...@hotmail.com
http://www.igordamiani.it
ICQ : 11847262

 ha scritto nel messaggio
news:e7umavkkchdf4s5qc...@4ax.com...

Il suggerimento circa la velocita' percepita resta sempre valido, puoi
comunque migliorare leggermente le performance rendendo invisibile il
controllo subito prima del ciclo di caricamento e ripristinandolo alla fine.
Per migliorare un po' l'effetto estetico puoi anche posizionare una label (e
magari anche la progress bar se decidi di usarla) centrata dietro al
ListView, con i classici "attendere prego..." & C, in modo che venga
visualizzata quando rendi invisibile la lista.
Naturalmente questo ha senso se effettui il caricamento a form gia'
visibile, se invece la procedura viene eseguita prima, ad esempio durante
Form_Load, allora non hai nessun vantaggio.
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmet L. Brown

 visualizzata quando rendi invisibile la lista.
Questa mi sembra l'idea migliore: nascondere l'oggetto evita il ridisegno e
dovrebbe accelerare parecchio il caricamento.
Mettendo una progressbar al centro, al posto della LV risulta anche
graficamente valido.
Eviterei il DoEvent a lista scoperta, specie se le inserzioni non sono
sempre sull'ultimo elemento: non vorrai che l'utente clicchi una linea
mentre sta ancora caricando facendoti scoppiare il programma in qualche
punto inaspettato :)
Inoltre in questo caso dovresti fermare il caricamento prima di eseguire
qualcos'altro.
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 ha scritto nel messaggio
news:e7umavkkchdf4s5qc...@4ax.com...

==================
Non te la prendere, ma secondo me è la logica che è sbagliata.
Mi spiego.
Una lista si usa perche poi l'utente possa scegliere qualcosa, altrimenti è
piu comoda e veloce una grid.
Ma una lista con 3000 item è inservibile all'utente.... come fa a scegliere?
Quindi, secondo me, molto piu opportuno popolare la lista per gruppi, e
quando l'utente selezione un gruppo in un'altra lista popoli gli item di
quel gruppo gruppo.
Un pò come gestione risorse, che quando lo apre mica legge tutti i file del
disco... ma solo le cartelle, poi scegli una cartella e lui legge il
contenuto di una sola cartella.
Greg

 piu comoda e veloce una grid.
Hmmm... siamo d'accordo che elenchi di dati molto numerosi non sono mai
troppo comodi da visualizzare, ma parlando di dati *in sola visualizzazione*
onestamente non vedo in che misura puo' essere piu' comoda una griglia
rispetto ad un listview in formato Report; l'unica vera differenza e' il
fatto di poter scegliere una cella rispetto ad un intero elemento ma questo
puo' o meno avere senso a seconda del contesto... laddove quello che devi
rappresentare e' un oggetto principale con delle informazioni aggiuntive,
allora il ListView e' il controllo corretto, indipendentemente dal fatto che
serva a selezionare o a visualizzare soltanto.
Anche il suggerimento di caricare a blocchi secondo una gerarchia e' in
linea di principio sacrosanto, pero' ha senso solo se questa gerarchia dei
dati esiste...
Incidentalmente, se hai una cartella con 3000 file, gestione risorse li
visualizza con la dovuta calma nel suddetto listview; anche qui per scomodo
che possa risultare, non vedo che beneficio ci sarebbe potuto essere usando
un controllo griglia.


 contenuto di una sola cartella.
Con questa logica io caricherei in batch cioè prenderei 1 o 200 record alla
volta ..
il tempo totale è ovviamente più lungo.
Saluti

 più rapido.
Puoi effettuare il caricamento in background lasciando attivo il programma
con le altre funzioni.
Certo che se tutte le funzioni si basano sul contenuto del list view
l'utilita' sara' limitata.
Non esiste un modo in assoluto per rendere piu' veloce l'operazione, pero'
se ti metti di buzzo buono puoi trovare un modo per gestire in modo diverso
il caricamento con una tecnica di paginazione.
Ossia, stabilisci un numero ragionevole di elementi per ogni pagina.
Un numero abbastanza alto da non rendere troppo frequente la richiesta di
cambio pagina, ma abbastanza basso da permettere la visualizzazione di ogni
pagina in tempi rapidi.
Poi quando l'utente chiede (con una scroll bar indipendente basata
sull'intero archivio) di vedere una parte esterna alla pagina attuale,
carichi la nuova pagina.
Se il numero di elementi per pagina e' calcolato bene tutto avverra' in modo
abbastanza rapido da dare l'impressione che tutti gli elementi siano
contemporaneamente presenti, ma si evitera' il tempo di caricamento
complessivo iniziale troppo lungo.
Io ho risolto con questo sistema il problema che avevo con i programmi per
archiviare i cd.
Avendo 130 Cd l'archivio (con tutte le strutture di file e directory per
ogni cd) era gigantesco (decine di megabyte) e i programmi che avevo
impiegavano decine di secondi per caricare l'archivio prima di permettermi
di fare una ricerca.
Era una palla. Quel programma mi serviva per trovare in modo *rapido* un cd,
se dovevo aspettare tutto quel tempo facevo prima a cercarlo manualmente
sulle mensole.
Poi ho fatto io un programma di quel tipo ma con sistemi a pagine per
accellerare il caricamento.
Ora il programma si carica in modo istantaneo e cerca i dati al volo mentre
carica da disco l'archivio, evitando quelle inquietanti sindromi d'attesa.
ciao
Paolo B.

Ringrazio tutti per i suggerimenti dati, penso che la logica esposta
da Paolo B. sia quella che meglio risolve il mio problema..... certo
richiede un po di lavoro ma se si vuole qualcosa di efficace e
funzionale non si può fare altrimenti.
Ciao