Prima di buttarmi nel futuro raccontadovi ciò che seguirò a PDC voglio restare nel presente parlandovi di un problema comune.
Capita spesso di dover creare controlli a runtime in base alle informazioni date dall'utente, da una fonte db o xml e la prima volta che l'abbiamo fatto credo che tutti (almeno io, cascato in pieno) ci siamo trovati di fronte a seguito di un postback alla misteriosa scomparsa di essi.
A dir la verità i controlli sono sempre creati a runtime, anche quelli presenti nei file aspx e ascx, solo che il codice è persistito nei files temporanei e viene rieseguito ad ogni richiesta della pagina.
Dobbiamo infatti ricordarci che ogni richiesta è soddisfatta con una nuova istanza della nostra classe Page, di conseguenza i controlli e tutto ciò che è stato fatto viene perso.
La soluzione che di solito adotto consiste nel memorizzare nel ViewState le informazioni minime indispensabili per ricreare almeno lo stesso albero di controlli presente alla richiesta precente.
Per esempio se dal db prelevo 10 records che mi indicano di creare 10 TextBox con un certo colore e dimensione, mi limiterò a memorizzare solo il numero 10 nel ViewState. Questo perché al postback della pagina il numero delle TextBox è sufficiente per creare la stessa lista di controlli. Per il resto ci penserà il ViewState di ogni controllo che di default memorizza tutte le sue proprietà di colore, style e dimensione.
L'ho probabilmente già detto, ma lo ripeto. Questo codice:
TextBox t1 = new TextBox(); t1.ForeColor = Color.Red; this.Controls.Add(t1);
è diverso da:
TextBox t1 = new TextBox(); this.Controls.Add(t1); t1.ForeColor = Color.Red;
Il primo infatti non persiste nel ViewState la proprietà ForeColor e potrebbe portare a risultati inattesi. Viceversa potrebbe essere utile, per ottimizzare il ViewState solo in certe proprietà, il primo codice.
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- LINQ, lazy loading e architettura, l'11 marzo 2011 alle 18:42
- MetadataDiffViewer: aggiornato al .NET Framework 4.0, Silverlight 4.0 e Sharepoint 2010, il 7 gennaio 2010 alle 13:58
- .NET Framework 4.0 beta 1: Windows Communication Foundation, il 18 maggio 2009 alle 16:00
- Parallelizzare in Silverlight 2.0, il 21 aprile 2009 alle 00:25
- Silverlight: performance dell'isolated storage, il 16 aprile 2009 alle 17:38
- MetadataDiffViewer: differenze tra i framework, il 15 aprile 2009 alle 18:56