Note that there are some explanatory texts on larger screens.

plurals
  1. POCreating dynamic controls in Page_PreRender based on viewstate causes button OnClick event to not work
    text
    copied!<p>I realize that dynamic controls should be created within Page_Load and Page_Init in order for them to be registered in the control tree.</p> <p>I have created a custom control that requires the use of ViewState in a button OnClick event. This ViewState is then used to dynamically create controls.</p> <p>Since the life-cycle will go: Page Load -> Button Click -> Page PreRender. The view-state will not be updated until "Button Click", thus I am creating my dynamic controls in Page PreRender. However, creating a button and programatically assigning the OnClick EventHandler in Page_PreRender does not work.</p> <p>Does anyone know how I can get this to work? </p> <p>btn_DeleteTableRow_Click will not fire. This is setup in CreatePartRows()</p> <p>Here is my example:</p> <pre><code>&lt;asp:UpdatePanel ID="up_RMAPart" runat="server" UpdateMode="Conditional" EnableViewState="true" ChildrenAsTriggers="true"&gt; &lt;ContentTemplate&gt; &lt;div class="button" style="width: 54px; margin: 0px; float: right;"&gt; &lt;asp:Button ID="btn_AddPart" runat="server" Text="Add" OnClick="btn_AddPart_Click" /&gt; &lt;/div&gt; &lt;asp:Table ID="Table_Parts" runat="server" CssClass="hor-zebra"&gt; &lt;/asp:Table&gt; &lt;div class="clear"&gt;&lt;/div&gt; &lt;/ContentTemplate&gt; &lt;Triggers&gt; &lt;asp:AsyncPostBackTrigger ControlID="btn_AddPart" EventName="Click" /&gt; &lt;/Triggers&gt; </code></pre> <p></p> <p>Code Behind:</p> <pre><code>[Serializable] public struct Part { public string PartName; public int Quantity; public int PartID; public Part(string sPartName, int iQuantity, int iPartID) { PartName = sPartName; Quantity = iQuantity; PartID = iPartID; } } public partial class RMAPart : System.Web.UI.UserControl { private Dictionary&lt;string,Part&gt; m_RMAParts; private int m_RowNumber = 0; public Dictionary&lt;string, Part&gt; RMAParts { get { if (ViewState["m_RMAParts"] != null) return (Dictionary&lt;string, Part&gt;)ViewState["m_RMAParts"]; else return null; } set { ViewState["m_RMAParts"] = value; } } public int RowNumber { get { if (ViewState["m_RowNumber"] != null) return Convert.ToInt32(ViewState["m_RowNumber"]); else return 0; } set { ViewState["m_RowNumber"] = value; } } protected void Page_Load(object sender, EventArgs e) { if (!Page.IsPostBack) { RMAParts = new Dictionary&lt;string, Part&gt;(); RowNumber = 0; RMAParts.Add("PartRow_" + RowNumber.ToString(), new Part()); RowNumber = 1; CreatePartRows(); } } protected void Page_PreRender(object sender, EventArgs e) { CreatePartRows(); } private void CreatePartRows() { Table_Parts.Controls.Clear(); TableHeaderRow thr = new TableHeaderRow(); TableHeaderCell thc1 = new TableHeaderCell(); thc1.Controls.Add(new LiteralControl("Part")); thr.Cells.Add(thc1); TableHeaderCell thc2 = new TableHeaderCell(); thc2.Controls.Add(new LiteralControl("Quantity")); thr.Cells.Add(thc2); TableHeaderCell thc3 = new TableHeaderCell(); thc3.Controls.Add(new LiteralControl("")); thr.Cells.Add(thc3); Table_Parts.Rows.Add(thr); foreach (KeyValuePair&lt;string, Part&gt; kvp in RMAParts) { string[] sKey = kvp.Key.Split('_'); TableRow tr = new TableRow(); tr.ID = kvp.Key; TableCell tc1 = new TableCell(); TextBox tb_Part = new TextBox(); tb_Part.ID = "tb_Part_" + sKey[1]; tb_Part.CssClass = "textbox1"; tc1.Controls.Add(tb_Part); tr.Cells.Add(tc1); TableCell tc2 = new TableCell(); TextBox tb_Quantity = new TextBox(); tb_Quantity.ID = "tb_Quanitty_" + sKey[1]; tb_Quantity.CssClass = "textbox1"; tc2.Controls.Add(tb_Quantity); tr.Cells.Add(tc2); TableCell tc3 = new TableCell(); Button btn_Delete = new Button(); btn_Delete.ID = "btn_Delete_" + sKey[1]; btn_Delete.CommandArgument = tr.ID; btn_Delete.Click += new EventHandler(btn_DeleteTableRow_Click); btn_Delete.Text = "Remove"; tc3.Controls.Add(btn_Delete); tr.Cells.Add(tc3); Table_Parts.Rows.Add(tr); } } public void Reset() { Table_Parts.Controls.Clear(); RMAParts.Clear(); RowNumber = 0; RMAParts.Add("PartRow_" + RowNumber.ToString(), new Part()); RowNumber = 1; CreatePartRows(); } protected void btn_AddPart_Click(object sender, EventArgs e) { RMAParts.Add("PartRow_" + RowNumber.ToString(), new Part()); RowNumber++; } protected void btn_DeleteTableRow_Click(object sender, EventArgs e) { Button btn = (Button)sender; TableRow tr = (TableRow)Table_Parts.FindControl(btn.CommandArgument); Table_Parts.Rows.Remove(tr); RMAParts.Remove(btn.CommandArgument); } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload