Note that there are some explanatory texts on larger screens.

plurals
  1. POHow to add dynamically created buttons to a dynamically created table?
    text
    copied!<p>A question has been really bugging me lately. I hope you would help me.</p> <p>I want to create a table after a user clicks a button. On each row in the first cell I want to add a button. Unfortunately, the table buttons fail to fire an event. Could you tell me how to do it or where my mistake is? I have used <a href="http://www.codeproject.com/kb/aspnet/dynamiccontrolsByLeon.aspx" rel="nofollow">this article</a> to create the following example code.</p> <pre><code>&lt;asp:PlaceHolder ID="placeHolderForTable" runat="server"&gt; &lt;/asp:PlaceHolder&gt; &lt;asp:Button ID="btnCreateTbl" runat="server" Text="Create Table"/&gt; &lt;asp:Label ID="lblResult" runat="server" /&gt; </code></pre> <p>Code:</p> <pre><code>private struct ControlInfo { public string ID; public string Type; public int Border; public HtmlTableRow[] TblRows; public HtmlTableCell[] TblCells; public int Width; public int Height; } protected void Page_Load(object sender, EventArgs e) { btnCreateTbl.Click+=new EventHandler(BtnClick); if (this.IsPostBack) this.RecreatePersistedControls(); }//end Page_Load //Call CreateControl for each persisted control private void RecreatePersistedControls() { ArrayList al = (ArrayList)this.Session["DynamicControls"]; if (al != null) foreach (ControlInfo ci in al) this.CreateControl(ci); }//end RecreatePersisterdControls method //Create control specified by ControlInfo structure private Control CreateControl(ControlInfo ci) { Control ctl = null; switch (ci.Type) { case "Button": ctl = new Button(); ctl.ID = ci.ID; ((Button)ctl).Text = "Edit"; ((Button)ctl).Click+=new EventHandler(this.DoNothing); if (this.placeHolderForTable.FindControl("tblResult") != null) { for (int r = 0; r &lt; ci.Height; r++) { if (this.placeHolderForTable.FindControl("tblResult").FindControl("tr" + (r + 1)) != null &amp;&amp; (r+1).ToString()==ci.ID[7].ToString()) if (this.placeHolderForTable.FindControl("tblResult").FindControl("tr" + (r + 1)).FindControl("td" + (r + 1) + "1") != null) if(this.placeHolderForTable.FindControl("tblResult").FindControl("tr" + (r + 1)).FindControl("td" + (r + 1) + "1").FindControl(ctl.ID)==null) this.placeHolderForTable.FindControl("tblResult").FindControl("tr" + (r + 1)).FindControl("td" + (r + 1) + "1").Controls.Add(ctl); } } break; case "HtmlTable": ctl = new HtmlTable(); ctl.ID = ci.ID; ((HtmlTable)ctl).Border = ci.Border; for (int r = 0; r &lt; ci.Height; r++) { HtmlTableRow row = ci.TblRows[r]; row.ID = "tr" + (r + 1); for (int c = r * ci.Width; c &lt; r * ci.Width+2; c++) { ci.TblCells[c].ID="td"+(r+1)+(c%2+1); row.Cells.Add(ci.TblCells[c]); } ((HtmlTable)ctl).Rows.Add(row); } if(this.placeHolderForTable.FindControl(ctl.ID)==null) this.placeHolderForTable.Controls.Add(ctl); break; default: return null; } return ctl; }//end CreateControl method //Create ControlInfo structure and persist it to Session private ControlInfo PersistControl(string id, string type, int border, HtmlTableRow[] tblRows, HtmlTableCell[] tblCells, int width, int height) { ControlInfo ci = new ControlInfo(); ci.ID = id; ci.Type = type; ci.Border = border; ci.TblRows = tblRows; ci.TblCells = tblCells; ci.Width = width; ci.Height = height; ArrayList al = (ArrayList)this.Session["DynamicControls"]; if (al == null) al = new ArrayList(); al.Add(ci); this.Session["DynamicControls"] = al; return ci; }//end PersistControl method private void BtnClick(object sender, EventArgs e) { int cellIx=0,rowIx=0; HtmlTableRow tr1 = new HtmlTableRow(); HtmlTableCell td11 = new HtmlTableCell(); tr1.Cells.Add(td11); HtmlTableCell td12 = new HtmlTableCell(); td12.InnerText = "td12"; tr1.Cells.Add(td12); HtmlTableRow tr2 = new HtmlTableRow(); HtmlTableCell td21 = new HtmlTableCell(); tr2.Cells.Add(td21); HtmlTableCell td22 = new HtmlTableCell(); tr2.Cells.Add(td22); td22.InnerText = "td22"; HtmlTableRow []arrRows=new HtmlTableRow[2]; arrRows[rowIx++]=tr1; arrRows[rowIx++]=tr2; HtmlTableCell []arrCells=new HtmlTableCell[4]; arrCells[cellIx++]=td11; arrCells[cellIx++]=td12; arrCells[cellIx++]=td21; arrCells[cellIx++]=td22; ControlInfo ci = PersistControl("tblResult", "HtmlTable", 3, arrRows, arrCells, 2, 2); HtmlTable tblResult = (HtmlTable)CreateControl(ci); ci = PersistControl("btnEdit1", "Button", 0, arrRows, arrCells, 2, 2); Button btnEdit1 = (Button)CreateControl(ci); ci = PersistControl("btnEdit2", "Button", 0, arrRows, arrCells, 2, 2); Button btnEdit2 = (Button)CreateControl(ci); } public void DoNothing(object sender, EventArgs e) { lblResult.Text = (sender as HtmlButton).ID + " done"; } </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