I have a page that contains some dynamically created controls (TextBox and DropDownList). When a postback occurs, the TextBoxes keep their values, but the DropDownLists lose their ListItems. This is quite confusing, since the page level DropDownList also keeps its ListItems. Can anyone see what's wrong with the code below?
Any help in solving this issue would be greatly appreciated.
<%@ Page Language="VB"%>
<script runat="server">
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs)
If Not Page.IsPostBack Then
ddlFixed.Items.Add(New ListItem("12", "13"))
ddlFixed.Items.Add(New ListItem("14", "15"))
End If
Dim i As Integer
For i = 0 To 3
Dim ddl As New DropDownList
ddl.ID = "ddlPage" & i
ddl.EnableViewState = True
If Not Page.IsPostBack Then
ddl.Items.Add(New ListItem("12", "13"))
ddl.Items.Add(New ListItem("14", "15"))
End If
pnlDynamic.Controls.Add(ddl)
Dim txtBx As New TextBox
txtBx.ID = "txtPage" & i
If Not Page.IsPostBack Then
txtBx.Text = "Preset"
End If
pnlDynamic.Controls.Add(txtBx)
Next
End Sub
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server" enableviewstate="true">
<div>
<br />
<br />
<a href="Default.aspx">Get-Request</a>
<br />
<br />
<asp:Panel runat="server" ID="pnlDynamic" EnableViewState="true" />
<br />
<br />
<asp:DropDownList runat="server" ID="ddlFixed" />
<asp:Button runat="server" ID="btn" Text="Postback"/>
</div>
</form>
</body>
</html>
I have found the solution that will allow me to keep the viewstate across postbacks. It's to call TrackViewState of the ItemCollection.
Thanks to all for your help.
This is the working solution:
A DDL will maintain its items and selection when viewstate is enabled. A textbox will maintain its contents regardless of viewstate since the resulting html is written back to the server on a postback.
I find it courious that you have all these viewstate statements in your code and markup.
One of several things is happening:
May be you need to explicitly activate the ViewState for those DropDownLists...
EDIT: This is what I mean by my last comment...
I always use
Page_Load
and never have trouble like this. Maybe something you could look at.I generally bind data to controls the first time the page loads, and after that let Viewstate handle postbacks etc. Note that they suggest you bind data during
Page_Load
...Check out http://support.microsoft.com/kb/305141
The list items in a DropDownList are not stored in view state. You'll have to add them on every postback.
What's stored in view state is the selected index - ie. the 'value' of the control.
Edit: Well, it seems I learned something today. I stand corrected :-)