Newsgroup: it.comp.dotnet
Titolo: VB- controllo simile alla MSHFlexGrid VB6

Ciao a tutti,
tempo fa postai una richiesta simile su un ng analogo, quindi qualcuno di 
voi avra' gia' letto la richiesta, anche se, adesso, ho le idee un pochinino 
piu' chiare.
In un mio programma scritto in VB6, utilizzavo una MSHFlexGrid che 
visualizzava una sorta di calendario, dove ogni colonna rappresentava un 
giorno, mentre ogni riga una certa ora.
Immaginatevi un planning per gli appuntamenti, tanto per capirci, dove viene 
segnato solo se quella determinata ora, in quel determinato giorno, e' 
occupato o meno (senza altre informazioni).
Il problema principale e' che questo planning potrebbe dover visualizzare un 
bel po' di giorni, anche qualche anno (e quindi 365 * anni) colonne.
Sto provando ad usare, in un WinForm, la DataGrdiViewer, la quale ha un 
piccolo problema...
Andando ad impostare manualmente il numero di colonne visualizzate, tramite
Me.dgvDates.ColumnCount = CL
Dove naturalmente dgvDates e' la mia griglia, e CL e' il numero delle 
colonne che voglio visualizzare, le colonne cosi' create hanno tutte la 
proprieta' FillWeight impostata a 100, come da default, e questo limita il 
numero massimo di colonne visualizzabili a 655, dato che la somma totale dei 
valori dei FillWeight non puo' superare 65535.
Una soluzione possibile sarebbe quella di aggiungere con un ciclo ogni 
singola colonna, dopo aver impostato la proprieta' FillWeight della colonna 
stessa a valori minori di 100, cosi' da poter visualizzare piu' colonne, ma 
ho paura (non ho ancora provato, ma lo faro') che questo modo di lavorare 
rallenti un po' le cose.
Il motivo per cui ancora non ho provato, e sto rompendo le scatole a voi in 
questa giornata di Agosto e', principalmente perche' sto aspettando ancora 
le ferie, che arriveranno solo a partire dal prossimo WE, anche se 
ufficialmente devo dire che sto cercando anche qualche controllo alternativo 
(anche Wpf da hostare sulla form) che possa fare lo stesso lavoro, tenendo 
conto che:
Le prime due righe dovrebbero  essere poste in merge, cioe' la prima riga, 
che rappresenta l'anno, dovrebbe non avere ogni cella che riporta , ad 
esempio, 2011, ma dovrebbe avere una unica cella, grande quanto tutte le 
colonne interessate, che riporta un unico valore 2011; la stessa cosa 
dovrebbe fare la seconda riga, per il mese. Ho trovato qualche post che 
indica come farlo con la DataGridViewer, anche se non e' proprio 
semplicissimo.
Il numero delle colonne *dovrebbe* poter essere (virtualmente) infinito, 
anche se un limite intorno al migliaio di colonne e' piu' che accettabile.
Sto utilizzando VS2008, quindi FW 3.5 sp1.
Potrei anche migrare verso 2010 e FW 4, ma se posso evitarlo, per il 
momento, e' meglio :-)

 DataGrdiViewer, la quale ha un piccolo problema...
non esistono monitor in grado di visualizzare centinaia di colonne.
se va bene, a video riesci ad averne al massimo alcune decine 
*leggibili*; per le altre devi necessariamente scrollare.
a questo punto perche' non bindare le colonne solo quando servono?
decidi la dimensione dell'area di lavoro (chesso', 30/40 colonne) e poi 
metti dei pulsanti o una barra per consentire lo scrolling all'utente.
barra e pulsanti non fanno altro che bindare i dati corretti alle colonne 
visibili.
[cut]
-- 
Paolo opg
BE AWARE that this post uses a fake reply-to address
to contact me write to:
janickg ( at ) hotmail ( dot ) com
--

non esistono monitor in grado di visualizzare centinaia di colonne.
se va bene, a video riesci ad averne al massimo alcune decine
*leggibili*; per le altre devi necessariamente scrollare.
a questo punto perche' non bindare le colonne solo quando servono?
...
Ho notato, in altre prova fatte prima, che a volte il caricare "al volo" i 
dati da visualizzare, puo' far rallentare la visualizzazione dei dati 
stessi, specie in scrolling molto veloci.
Attualmente ho risolto il primo quesito, sempre utilizzando la DataGridView, 
andando ad aggiungere dinamicamente le colonne necessarie ed impstando la 
proprieta' FillWeight ad un valore "buono".
In questo modo sono riuscito ad aggiungere anche il numero di giorni 
equivalenti ad 8 anni (una esagerazione, ma per prova...), ottenendo ottimi 
risultati anche dal punto di vista dello scrolling.
Certo, al caricamento ci ha messo circa 8 secondi, ma e' moooolto piu' che 
accettabile.
Ora pero' mi resta il problema del merge delle celle con i nomi dei mesi e 
il numero degli anni.
Resto in attesa di indicazioni :-)

 specie in scrolling molto veloci.
condivido quello che dice Paolo, devi virtualizzare le colonne, 
altrimenti non ne esci più, rischi sempre di raggiungere limiti e/o 
avere problemi che sono insormontabili.
Il priblema di fondo è che con Windows Forms non c'è mezzo di 
virtualizzare le colonne mentre le puoi fare con WPF, in realtà no...ma 
ci puoi arrivare virtualizzando le righe e cambiando l'HostPanel per 
usare le righe come se fossero colonne.
.m
-- 
Mauro Servienti
{C67C0157-5D98-4733-A75E-93CAEE4BADC8}
Microsoft MVP - Visual C# / MCTS
http://mvp.support.microsoft.com/profile/mauro
blog @ 
http://milestone.topics.it
whynot [ at ] topics [ dot ] it

>condivido quello che dice Paolo, devi virtualizzare le colonne,
altrimenti non ne esci più, rischi sempre di raggiungere limiti e/o
avere problemi che sono insormontabili.
....
Ma come, adesso che ho risolto? :-)
Non virtualizzando, ma operando come descritto in precedenza (cambiando 
cioe' il FillWeight di ciascuna colonna al momento della creazione della 
stessa), ho ottenuto ottimi risultati in termini di tempo di disegno della 
griglia, e una velocita' di scrolling perfetta per quello che mi serve.
I limiti sicuramente ci sono, ma porre un limite di tempo visualizzabile ad 
esempio a 3 anni, non e' affatto un problema per quello che sto facendo.
Quali vantaggi otterrei? Forse un consumo di memoria minore, ma a questi 
livelli non e' un problema.
Ad occhio, pero', virtualizzare il tutto dovrebbe portare qualche ritardo di 
ridisegno della griglia durante lo scrolling. O sbaglio?
Per quel che riguarda il merge delle celle, sto facendo delle prove diverse, 
cioe' sto cercando di eliminare le righe che indicano anni e mesi, e mettere 
due label per i mesi e due per gli anni ( proprio poco piu' in alto  della 
griglia e andare a scrivere li dentro i mesi e gli anni, dato che non posso 
avere piu' di due mesi (e quindi due anni) visualizzati contemporaneamente a 
monitor 

 ridisegno della griglia durante lo scrolling. O sbaglio?
dipende come lo fai, ad esempio Outlook virtualizza la listbox che 
contiene i messaggi e lo fa divinamente, nella mia inbox ci sono più di 
39.000 email e scrolla come se nulla fosse. Non ho mica che sia facile, 
anzi :-)
