I segreti del DatagridView

Durante i Community Days Davide mi ha chiesto assistenza sull'applicazione che ha utilizzato per la demo (la famosa applicazione sviluppata da Igor).
Il problema era un DatagridView in Binding con un dataset di circa 1000 righe che impiegava parecchi minuti a popolarsi. 1000 righe sono un bel numero ma non sono tantissime per una griglia windows forms e parecchi minuti sono un po' troppi.
Abbiamo dato un'occhiata al codice, fatto qualche prova, ma nulla: era irrimediabilmente lento e sull'istante non siamo riusciti a risolvere il problema (ho fatto anche una bella figuraccia visto che dopo poche ore dovevo tenere la sessione sul Databinding!!).

Oggi mi sono scaricato la demo e ho riguardato il codice. Il problema sembrava sulla DatagridView e ripassando i settaggi delle proprietà mi è caduto l'occhio sul RowHeadersWidthSizeMode impostato a AutoSizeToAllHeaders che in pratica dice alla GridView di ridimensionare la larghezza degli header in base alla dimensione del contenuto della cella (se indagate con Reflector vedrete che cerca il max tra tutte le righe).
In questo modo però ad ogni riga aggiunta dall'engine di binding la Grid si ricalcola la larghezza di ogni colonna e questo rallenta il popolamento.

Il problema di Davide  si può risolvere lasciando RowHeadersWidthSizeMode settato a EnableResizing (il default) e risettandolo a AutoSizeToAllHeaders solo dopo che il binding è terminato.

Quindi problema risolto ma in ritardo. E allora come ha fatto davide a far funzionare la demo?
Davide è il guru di  SqlServer ed è giusto dare a Cesare ciò che è di Cesare ;-) quindi lascio a lui l'onore di spiegarci il trucco! :-D

Print | posted on venerdì 14 aprile 2006 22:53