I have the following code to create dynamic controls on a page
<table><tr><td>one</td><td>two</td><td>three</td><td>four</td><td>five</td><td>six</td></tr><tr><td><asp:TextBox ID="One" runat="server"></asp:TextBox></td><td><asp:TextBox ID="Two" runat="server"></asp:TextBox></td><td><asp:TextBox ID="Three" runat="server"></asp:TextBox></td><td><asp:TextBox ID="Four" runat="server"></asp:TextBox></td><td><asp:TextBox ID="Five" runat="server"></asp:TextBox></td></tr><asp:PlaceHolder ID="DynamicControlsHolder1" runat="server"></asp:PlaceHolder></table><table><tr><td><asp:Button ID="Button2" runat="server" OnClick="Button2_Click" Text="Add Section" /></td></tr></table>
Code Behind
private List<string> ControlsList
{
get
{
if (ViewState["controls"] == null)
{
ViewState["controls"] = new List<string>();
}
return (List<string>)ViewState["controls"];
}
}
private int NextID
{
get
{
return ControlsList.Count + 1;
}
}
protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
DynamicControlsHolder1.Controls.Add(new LiteralControl("<tr>"));
foreach (string txtID in ControlsList)
{
TextBox txt = new TextBox();
txt.ID = txtID;
DynamicControlsHolder1.Controls.Add(new LiteralControl("<td>"));
DynamicControlsHolder1.Controls.Add(txt);
DynamicControlsHolder1.Controls.Add(new LiteralControl("</td>"));
}
DynamicControlsHolder1.Controls.Add(new LiteralControl("</tr>"));
}
protected void Button2_Click(object sender, EventArgs e)
{
TextBox txt1 = new TextBox();
TextBox txt2 = new TextBox();
TextBox txt3 = new TextBox();
TextBox txt4 = new TextBox();
TextBox txt5 = new TextBox();
TextBox txt6 = new TextBox();
txt1.ID = "Size" + NextID.ToString();
DynamicControlsHolder1.Controls.Add(new LiteralControl("<tr><td>"));
DynamicControlsHolder1.Controls.Add(txt1);
DynamicControlsHolder1.Controls.Add(new LiteralControl("</td>"));
ControlsList.Add(txt1.ID);
txt2.ID = "Size" + NextID.ToString();
DynamicControlsHolder1.Controls.Add(new LiteralControl("<td>"));
DynamicControlsHolder1.Controls.Add(txt2);
DynamicControlsHolder1.Controls.Add(new LiteralControl("</td>"));
ControlsList.Add(txt2.ID);
txt3.ID = "Size" + NextID.ToString();
DynamicControlsHolder1.Controls.Add(new LiteralControl("<td>"));
DynamicControlsHolder1.Controls.Add(txt3);
DynamicControlsHolder1.Controls.Add(new LiteralControl("</td>"));
ControlsList.Add(txt3.ID);
txt4.ID = "Size" + NextID.ToString();
DynamicControlsHolder1.Controls.Add(new LiteralControl("<td>"));
DynamicControlsHolder1.Controls.Add(txt4);
DynamicControlsHolder1.Controls.Add(new LiteralControl("</td>"));
ControlsList.Add(txt4.ID);
txt5.ID = "Size" + NextID.ToString();
DynamicControlsHolder1.Controls.Add(new LiteralControl("<td>"));
DynamicControlsHolder1.Controls.Add(txt5);
DynamicControlsHolder1.Controls.Add(new LiteralControl("</td>"));
ControlsList.Add(txt5.ID);
txt6.ID = "Size" + NextID.ToString();
DynamicControlsHolder1.Controls.Add(new LiteralControl("<td>"));
DynamicControlsHolder1.Controls.Add(txt6);
DynamicControlsHolder1.Controls.Add(new LiteralControl("</td></tr>"));
ControlsList.Add(txt6.ID);
}Now everyting seems to work ok when i click the button once, the page formats correctly, the issue occurs when i click the button more than 2 times, i did a view source after 3 button clicks to see how it formats and this is how the output comes out which i can't understand why or how to fix it
<table><tr><td>one</td><td>two</td><td>three</td><td>four</td><td>five</td>
<td>six</td></tr><tr><td><input name="One" type="text" id="One"/></td><td><input name="Two" type="text" id="Two"/></td><td><input name="Three" type="text" id="Three" /></td><td><input name="Four" type="text" id="Four" /></td><td><input name="Five" type="text" id="Five" /></td><td><input name="Six" type="text" id="Six" /></td></tr><tr><td><input name="Size1" type="text" id="Size1" /></td><td><input name="Size2" type="text" id="Size2" /></td><td><input name="Size3" type="text" id="Size3" /></td><td><input name="Size4" type="text" id="Size4" /></td><td><input name="Size5" type="text" id="Size5" /></td><td><input name="Size6" type="text" id="Size6" /></td><td><input name="Size7" type="text" id="Size7" /></td><td><input name="Size8" type="text" id="Size8" /></td><td><input name="Size9" type="text" id="Size9" /></td><td><input name="Size10" type="text" id="Size10" /></td><td><input name="Size11" type="text" id="Size11" /></td><td><input name="Size12" type="text" id="Size12" /></td></tr><tr><td><input name="Size13" type="text" id="Size13" /></td><td><input name="Size14" type="text" id="Size14" /></td><td><input name="Size15" type="text" id="Size15" /></td><td><input name="Size16" type="text" id="Size16" /></td><td><input name="Size17" type="text" id="Size17" /></td><td><input name="Size18" type="text" id="Size18" /></td></tr></table>
The issue seems to be with this piece of code, but i can't figure out what to do with it in order to fix it.
protected override void LoadViewState(object savedState)
{
base.LoadViewState(savedState);
DynamicControlsHolder1.Controls.Add(new LiteralControl("<tr>"));
foreach (string txtID in ControlsList)
{
TextBox txt = new TextBox();
txt.ID = txtID;
DynamicControlsHolder1.Controls.Add(new LiteralControl("<td>"));
DynamicControlsHolder1.Controls.Add(txt);
DynamicControlsHolder1.Controls.Add(new LiteralControl("</td>"));
}
DynamicControlsHolder1.Controls.Add(new LiteralControl("</tr>"));
}
Any help is very much appreciated.