Ultimamente ho riaffrontato un problema che avevo già affrontato con Davide:
Inserire dei controlli a runtime in un updatepanel.
Per farvi capire il problema, provate ad eseguire il seguente codice, ogni qual volta dovete aggiornare il vostro update panel:
TextBox newtxt = new TextBox(); newtxt.ID = Guid.NewGuid().ToString(); Literal l = new Literal(); l.Text = "<br />"; UpdatePanel1.ContentTemplateContainer.Controls.Add(newtxt); UpdatePanel1.ContentTemplateContainer.Controls.Add(l);
vedrete che verrà inserito un nuovo controllo TextBox all'interno dell'updatepanel. Se proverete a rilanciare il codice, verrà creata una nuova TextBox e perderete quella vecchia.
Questo capita perchè dopo il postback i controlli inseriti a runtime non vengono ricreati. Toccherà a noi occuparci della ricreazione degli elementi utilizzando la ViewState della pagina:
Default.aspx
<body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <div style="float: left"> <asp:Label ID="lblOutUpdate" runat="server" /><br /> <asp:UpdatePanel ID="UpdatePanel1" runat="server"> <ContentTemplate> <asp:Label ID="lblInUpdate" runat="server" /><br /> <asp:TextBox ID="txtUpdatePanel0" runat="server" /><br /> </ContentTemplate> <Triggers> <asp:AsyncPostBackTrigger ControlID="bntOk" EventName="Click" /> </Triggers> </asp:UpdatePanel> </div> <div style="float: right"> <asp:Button ID="bntOk" runat="server" Text="Ok" onclick="bntOk_Click" /> </div> </form> </body>
public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { lblOutUpdate.Text = "Out updatepanel: " + DateTime.Now.ToString(); } protected void bntOk_Click(object sender, EventArgs e) { lblInUpdate.Text = "In updatepanel: " + DateTime.Now.ToString(); txtUpdatePanel0.Enabled = false; var r = from q in Request.Form.AllKeys where q.StartsWith("txtUpdatePanel") && !q.Equals("txtUpdatePanel0") select q; for (int i = 0; i < r.Count(); i++) { TextBox newtxt = new TextBox(); newtxt.ID = r.ElementAt(i); newtxt.Text = Request.Form.Get(r.ElementAt(i)); newtxt.Enabled = false; Literal l = new Literal(); l.Text = "<br />"; UpdatePanel1.ContentTemplateContainer.Controls.Add(newtxt); UpdatePanel1.ContentTemplateContainer.Controls.Add(l); } TextBox txt = new TextBox(); txt.Text = ""; txt.ID = "txtUpdatePanel" + (r.Count() + 1).ToString(); UpdatePanel1.ContentTemplateContainer.Controls.Add(txt); } }
In pratica, ogni qual volta si scatenerà l'evento associato all'update panel, andremo a recuperare tutti i controlli creati dinamicamente, li ricreeremo con i valori inseriti ed inseriremo il nuovo controlo che potrà esser utilizzato dall'utente.
Spero possa tornarvi utile.