469,903 Members | 2,031 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,903 developers. It's quick & easy.

viewstate and dynamic table

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);
}
}

Nov 19 '05 #1
1 4525
i think I've figured out what is going wrong here (or at least come up
with a solution to my problem).

the problem occurs when dynamic controls 'push' a viewstate populated
control to another location in the control tree. to fix this problem,
a better approach would be to RecreatePersistedControls immediately
after LoadViewState (rather than the Page_Load), e.g:

protected override void LoadViewState(object savedState)
{
base.LoadViewState (savedState);
RecreatePersistedControls();
}

this way the dynamic controls have been built at the point where
asp.net comes around to populating the select box, and everything
matches. and the viewstate collection is available if you are storing
your data/controls in there.

the aspalliance article I mentioned does have this to say on
LoadViewstate: "The best use of this method is to restore any dynamic
controls you created in events, based on values you must manually save
in ViewState, which is now available to use."

Nov 19 '05 #2

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

1 post views Thread by dschectman | last post: by
2 posts views Thread by Bernie V | last post: by
2 posts views Thread by H.c.m. Raaijmaakers | last post: by
3 posts views Thread by ryanmhuc | last post: by
1 post views Thread by Waqarahmed | last post: by
reply views Thread by Salome Sato | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.