Överlever inte kontroller som man lägger till dynamiskt till en ASP.NET sida en postback? Du måste manuellt lägga tillbaka dessa kontroller, förslagsvis i Init-eventet/OnInit-metoder/vad det nu är för Init Nu är jag inte 100% säker, men är det inte så att ViewStaten laddas först efter OnInit? Just det.Lägga till kontroller dynamiskt till en ASP.NET 2.0 sida
Jag lägger till ett antal textboxar och checkboxar till en Placeholder programmatiskt och dom visas helt ok på sidan. När jag sedan skall leta efter dessa kontroller (.FindControl) i Placeholdern (i en funktion kopplat till en Button på samma sida) så är Placeholdern helt tom, innehåller inga controls.item alls. Jag har satt EnableViewState på alla kontroller men det funkar inte, däremot funktionen som lägger till kontrollerna visar placeholdern med alla kontroller, men nånstans på vägen försvinner dessa vid nästa anrop. Vad gör jag för fel?
MichaelSv: Lägga till kontroller dynamiskt till en ASP.NET 2.0 sida
Sv:Lägga till kontroller dynamiskt till en ASP.NET 2.0 sida
Isåfall kan frågaren aldrig få tillbaka sina värden på kontrollerna.
http://infinitiesloop.blogspot.com/2006/03/truly-understanding-viewstate.htmlSv: Lägga till kontroller dynamiskt till en ASP.NET 2.0 sida
Skapa dynamiska kontroll i OnInit spå fixar du det.
Detta lilla exempel kanske bringar klarhet.
(OJ det blev i .NET 1.1 men det är ju skit samma i detta fallet.)
<%@ Page language="c#" Codebehind="Dynamic.aspx.cs" AutoEventWireup="false" Inherits="LaraNara.Server.Dynamic" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
<HEAD>
<title>Dynamic</title>
</HEAD>
<body>
<form id="Form1" method="post" runat="server">
<P><asp:Panel id="panelDynamic" runat="server"></asp:Panel></P>
<P><asp:Button id="btnOK" runat="server" Text="OK" Width="112px"></asp:Button></P>
<P><asp:Label id="lblOKresults" runat="server"></asp:Label></P>
<P><asp:Label id="lblNotSoOK" runat="server"></asp:Label></P>
</form>
</body>
</HTML>
och så Code behinden:
using System;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace DynamicControls
{
/// <summary>
/// Summary description for Dynamic.
/// </summary>
public class Dynamic : System.Web.UI.Page
{
protected System.Web.UI.WebControls.Label lblNotSoOK;
protected System.Web.UI.WebControls.Panel panelDynamic;
protected System.Web.UI.WebControls.Label lblOKresults;
protected TextBox txtBoxOK;
protected System.Web.UI.WebControls.Button btnOK;
protected TextBox txtBoxNotOK;
private void Page_Load(object sender, System.EventArgs e)
{
if( this.IsPostBack == false )
{
this.txtBoxNotOK = new TextBox();
this.txtBoxNotOK.Width = 200;
this.txtBoxNotOK.Height = 100;
this.txtBoxNotOK.TextMode = TextBoxMode.MultiLine;
this.txtBoxNotOK.Text = "Not so OK";
this.panelDynamic.Controls.Add( this.txtBoxNotOK );
}
}
#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
this.txtBoxOK = new TextBox();
this.txtBoxOK.Width = 200;
this.txtBoxOK.Height = 100;
this.txtBoxOK.TextMode = TextBoxMode.MultiLine;
this.txtBoxOK.Text = "OK to change";
this.panelDynamic.Controls.Add( this.txtBoxOK );
this.panelDynamic.Controls.Add( new LiteralControl("<br>") );
}
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.btnOK.Click += new System.EventHandler(this.btnOK_Click);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
private void btnOK_Click(object sender, System.EventArgs e)
{
if( this.txtBoxOK != null )
this.lblOKresults.Text = this.txtBoxOK.Text;
else
this.lblOKresults.Text = "this.txtBoxOK == null ";
if( this.txtBoxNotOK != null )
this.lblNotSoOK.Text = this.txtBoxNotOK.Text;
else
this.lblNotSoOK.Text = "this.txtBoxNotOK == null ";
}
}
}