Newsgroup: it.comp.lang.visual-basic
Titolo: Galleria immagini con vb.net

Ciao a tutti,
avevo la necessitą di generare una sorta di galleria prodotti.
Si parte da circa 2000 prodotti totali, quando apro la maschera mostro solo
le ultime stagioni e quindi sono circa 1000.
 
Premetto che le immagini sono thumbnail da 170*240px e pesano 12KB l'una.
 
Ho provato con un FlowLayoutPanel e delle picturebox, ma si impallava. Ho
provato con doublebuffered e cose varie trovate su internet, ma niente,
sempre diversi secondi di delay e poi si impallava a scorrere fino alla
fine. 
 
Ho provato con una datagridview, bindata ad una lista di oggetti con una
colonna image, era veloce ma per renderlo graficamente carino mi sembra
alquanto complicato (forse con #n colonne image?).
 
Alla fine ho risolto prendendo un webbrowser, con un template e relativo
CSS ho generato un HTML che ho dato in pasto al controllo. Fate conto che
ricreo l'html all'evento change di una textbox di ricerca. Bene č
velocissimo. Con un escamotage poi sono riuscito a fare un "addhandler" del
click dell'immagine, per mostrare i dettagli del prodotto.
 
Mi domando, č possibile che non ci sia qualche cosa per gestire un
centinaio di controlli in una maschera? Senza scomodare WPF e senza fare
paginazioni, o senza fare come ho dovuto?

 Premetto che le immagini sono thumbnail da 170*240px e pesano 12KB l'una.
 
Ma perchè farsi del male così ? non puoi certo mostrarle tutte e 1000
insieme, sullo schermo ce ne staranno una 20na alla volta...
 
Non conosco .net ma in VB 6 farei così: caricherei le immagini
da mostrare in una variabile ad indice per poi copiare quelle da
mostrare nei picturebox visibili sul form, in fondo si tratta di creare
una scrollbar (e/o un metodo per sfogliare le immagini) e usare 
l'indice
della scroll per indirizzare le immagini da infilare nelle picbox, e'
sicuramente meno traumatico che creare una galleria "statica" di
1000 immagini in un ambienteche non e' nato per la grafica...
 
 
A BRACCIO:
 
declare global VariabileImmagini(1000) as Bitmap
 
Sub main
 For x = 1 to 1000
  VariabileImmagini(x) = loadpicture ("immagine" & "i")
 next i
end sub
 
On scrollbar_scroll
 Dim i as byte
 For x = scrollbar.value to scrollbar.value +20
  form_main.picturebox(i).image = VariabileImmagini(x)
end sub

 1000 immagini in un ambienteche non e' nato per la grafica...
 
Quello che dici mi torna, ma mi sembra assurdo che oggi giorno ci siano
problemi a caricare 1000 foto per un totale di 12mb di dati. La riprova che
qualcosa non va ce l'ho con il fatto che se le carico su un datagridview
vanno senza problemi.
 
Forse dovrebbero implementare un container ottimizzato. In fondo se il
cliente ti chiede di vedere 200/300 controlli insieme avrà i suoi motivi, e
a me queste richieste le han fatte più di una volta. Poi ovviamente ci sono
i filtri e gli ordinamenti, ma avere tutto visibile ha il suo perchè.
 
La comodità di scorrere velocemente con la barra e vedere subito le foto è
ben diversa da quello che puoi fare caricando a mano delle foto e
visualizzandone solo 20 per volta.

 visualizzandone solo 20 per volta.
 
Si ma io non ho certo parlato di caricare a mano, io ho suggerito di
caricare le foto in una variabile, non in un controllo...

 fare anche questo" per un "lo farà benissimo"....
 
Ti ripeto, questi limiti probabilmente sono più di windows forms
intrinsecamente (o di GDI o roba simile), però non è pensabile che la
galleria immagini di uno smartphone da 100€ di 4 anni fa gestisca senza
problemi 2000 foto e un PC moderno non lo faccia.
Sicuramente c'è un problema con il numero di controlli in una form, cosa
che con la gridview non avviene perchè sono tutti al suo interno.
Per quello mi aspettavo di trovare faciclmente un container o un pattern
adatto.

 problemi 2000 foto e un PC moderno non lo faccia.
 
si ma dimentichi che .net e' nato nel 2002 e si porta dietro non
solo una struttura di base oggigiorgio arcaica, deve anche essere
retrocompatibile e (ripeto) non e' stato pensato per questo tipo
di lavoro, al contrario di directX e il paragone col cellulofono e'
IMHO valido fino ad un certo punto, comunque bòn, se hai risolto
tanto di guadagnato :)