Dynamically created DropDownList loses ListItems on Postback
18,629
I have found the solution that will allow me to keep the viewstate across postbacks. It's to call TrackViewState of the ItemCollection.
CType(ddl.Items, IStateManager).TrackViewState()
Thanks to all for your help.
This is the working solution:
<%@ 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
CType(ddl.Items, IStateManager).TrackViewState()
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 id="Head1" runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server" >
<div>
<br />
<br />
<a href="Default.aspx">Get-Request</a>
<br />
<br />
<asp:Panel runat="server" ID="pnlDynamic" />
<br />
<br />
<asp:DropDownList runat="server" ID="ddlFixed" />
<asp:Button runat="server" ID="btn" Text="Postback"/>
</div>
</form>
</body>
</html>
Author by
schudel
Updated on June 04, 2022Comments
-
schudel almost 2 years
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>
-
schudel about 15 yearsThanks. Why then are the ddlFixed items recreated although I'm not adding them in the postback cycle?
-
andleer about 15 yearsno correct. ddl items are maintained in viewstate. they only need to be added during the initial load.
-
andleer about 15 yearsList View Items do not have a viewstate property. You can only manipulate the viewstate on the DDL.
-
schudel about 15 yearsI added the EnableViewState for testing purposes. Since ddlFixed retains its state, so should the Panel and consequently the Ddls. Moving the creation to PreInit or Load didn't help also. I'm baffled...
-
schudel about 15 yearsThanks. Unfortunately this doesn't change the behaviour.
-
schudel about 15 yearsThanks. But I already explicitly set the EnableViewState on the dynamically created DDLs to True.
-
Romias about 15 years@schudel: I always do my Loading logic on OnPageLoad... the first time. May be the Panel is modifying your settings? (I never used a Panel in my ASP.net projects ever... )
-
andleer about 15 yearswhy all the manipulation of viewstate? try just using all the defaults.
-
schudel about 15 years@Romias: I tried to add the controls directly to the form: same result. tried onLoad: same result.
-
Romias about 15 yearsTry doing ALL that logic when IsNotPostBack. You are creating dinamically your controls but JUST adding Items when it is the first time. ddlFixed works because you don't "re-create" it every time.
-
schudel about 15 yearsThanks. The idea was to discurage 'try enabling the viewstate' comments. I started without all the EnableViewStates and it didn't work then either.
-
schudel about 15 years@Romias: this is intentional. I do not want to go back to the database on every postback to fill the DropDownLists. Basically I want to have the same behaviour for dynamically created controls as for static controls
-
ShigaSuresh about 15 yearswhy don't u just add your @page directive so that we can see it