Hi all,
Here's a problem I'm having with a dynamic table. Following the
guidelines here
(http://www.codeproject.com/aspnet/dynamiccontrols.asp), which make
perfect sense. The problem is that the table contains a SELECT box
populated on the initial load. Every time I postback I'm inserting a
column into the table, the dropdown always remains in the last column.
First time I postback the dropdown is populated okay. The second time
its empty.
I'm guessing there's something funny going on with the viewstate
population matching up with the control hierarchy. If I move the
dropdown out of the table everything is okay. This article has a very
good explanation of the page creation sequence
(http://aspalliance.com/articleViewer.aspx?aId=134&pId=). I think
first time around the control tree matches up when its attempting to
populate. In the second postback, the received __viewstate contains
the dynamic cell, inside LoadFromViewState the dynamic cells don't
exist yet, so the select doesn't match up?
Here's some code snippets:
ASPX---------------------------------------------------------------
<form id="Form1" method="post" runat="server">
<table id="tblLines" runat="server">
<tr>
<td>Select one:</td>
<td>
<select runat="server" id="SelLine" NAME="SelLine">
<option selected>Select one</option>
</select>
</td>
</tr>
</table>
<asp:Button ID="BtnAdd" Runat="server" Text="click me"></asp:Button>
<hr>
</form>
ASPX.CS------------------------------------------------------------
private void Page_Load(object sender, System.EventArgs e)
{
if (!IsPostBack)
{
// bind the selectbox to the array to populate it.
string[] strlines = new string[] {"Circle", "Jubilee", "Hammersmith",
"Metropolitan", "Central", "Northern"};
SelLine.DataSource = strlines;
SelLine.DataBind();
persistedControls = new ArrayList();
ViewState["persistedControls"] = persistedControls;
}
else
{
persistedControls = (ArrayList)ViewState["persistedControls"];
RecreatePersistedControls();
}
}
void RecreatePersistedControls()
{
HtmlTableRow tr = tblLines.Rows[0];
foreach (string line in persistedControls)
{
HtmlTableCell tc = new HtmlTableCell();
tc.InnerHtml = line;
tr.Cells.Insert(tr.Cells.Count-1, tc);
}
}
private void BtnAdd_Click(object sender, System.EventArgs e)
{
if (SelLine.SelectedIndex!=0)
{
string line = SelLine.Items[SelLine.SelectedIndex].Text;
HtmlTableRow tr = tblLines.Rows[0];
HtmlTableCell tc = new HtmlTableCell();
tc.InnerHtml = line;
tr.Cells.Insert(tr.Cells.Count-1, tc);
// add the text to the PersistedControls
persistedControls.Add(line);
}
}