954,560 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?
Have something to say? Contribute New Article Reply to this Article

Controls added to asp:panel not persisting on PostBack

First, let me start off by saying I am using ASP.NET 2.0 with VB as the default language using Visual Studio 2005.

I have a form that has an asp:panel on it that is seeded with an iniitial control. Through the use of the form, additional controls may be dynamically added to the form. The problem is that none of the dynamically added controls persist on a postback. Here's some example code the exhibits the behavior I am seeing.

First, the HTML:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="test2.aspx.vb" Inherits="test2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:Panel ID="divNav" runat="server" EnableViewState="true" Visible="true">
                <asp:LinkButton ID="lbHome" runat="server">0</asp:LinkButton>
            </asp:Panel>
            <asp:Button ID="Button1" runat="server" Text="Add Another Line" />
        </form>
    </body>
</html>


And now, the code behind:

Partial Class test2
    Inherits System.Web.UI.Page

    Private intLineNum As Integer

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            intLineNum = 1
        Else
            intLineNum += 1
        End If
    End Sub

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim lb As New LinkButton
        lb.ID = "lb" & intLineNum
        lb.Text = intLineNum
        Me.divNav.Controls.AddAt(Me.divNav.Controls.Count, New LiteralControl(""))
        Me.divNav.Controls.AddAt(Me.divNav.Controls.Count, (lb))

    End Sub

End Class


What happens is that when you click the button to add another LinkButton, it does indeed add a new LinkButton. The problem is that it won't add any others beyond that. I've tried both the Load and Pre_Init events for the page, but my code does not work in either of them.

I've also tried getting a count of the controls on the panel and using the AddAt method to add the new controls at the end of the array, but again I cannot find a way to make that work as it only ever sees at most two controls.

Can someone help out with this? Thanks.

zilonox
Newbie Poster
6 posts since May 2010
Reputation Points: 10
Solved Threads: 0
 

>Controls added to asp:panel not persisting on PostBack

And that is the main reason that one should have to use page_load or page_init event to add controls dynamically.

__avd
Posting Genius (adatapost)
Moderator
8,648 posts since Oct 2008
Reputation Points: 2,136
Solved Threads: 1,241
 

First, let me start off by saying I am using ASP.NET 2.0 with VB as the default language using Visual Studio 2005.

I have a form that has an asp:panel on it that is seeded with an iniitial control. Through the use of the form, additional controls may be dynamically added to the form. The problem is that none of the dynamically added controls persist on a postback. Here's some example code the exhibits the behavior I am seeing.

First, the HTML:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="test2.aspx.vb" Inherits="test2" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Untitled Page</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:Panel ID="divNav" runat="server" EnableViewState="true" Visible="true">
                <asp:LinkButton ID="lbHome" runat="server">0</asp:LinkButton>
            </asp:Panel>
            <asp:Button ID="Button1" runat="server" Text="Add Another Line" />
        </form>
    </body>
</html>

And now, the code behind:

Partial Class test2
    Inherits System.Web.UI.Page

    Private intLineNum As Integer

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            intLineNum = 1
        Else
            intLineNum += 1
        End If
    End Sub

    Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim lb As New LinkButton
        lb.ID = "lb" & intLineNum
        lb.Text = intLineNum
        Me.divNav.Controls.AddAt(Me.divNav.Controls.Count, New LiteralControl(""))
        Me.divNav.Controls.AddAt(Me.divNav.Controls.Count, (lb))

    End Sub

End Class

What happens is that when you click the button to add another LinkButton, it does indeed add a new LinkButton. The problem is that it won't add any others beyond that. I've tried both the Load and Pre_Init events for the page, but my code does not work in either of them.

I've also tried getting a count of the controls on the panel and using the AddAt method to add the new controls at the end of the array, but again I cannot find a way to make that work as it only ever sees at most two controls.

Can someone help out with this? Thanks.


to add control dynamically you can use javascript or jquery thats most effective. if you think you start working with javascript or jquery i help you?
b'coz server side postback load whole html page and request is http so http is stateless protocol whole page request to server side that's why that's happening. the solution is use jquery or javascript....

chiragsathit
Newbie Poster
14 posts since May 2010
Reputation Points: 10
Solved Threads: 3
 
And that is the main reason that one should have to use page_load or page_init event to add controls dynamically.

Fair enough. I altered my code behind as follows:

Partial Class test2
    Inherits System.Web.UI.Page

    Private intLineNum As Integer

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not Page.IsPostBack Then
            intLineNum = 1
        Else
            intLineNum = intLineNum + 1
            Dim lb As New LinkButton
            lb.ID = "lb" & intLineNum
            lb.Text = intLineNum
            Me.divNav.Controls.AddAt(Me.divNav.Controls.Count, New LiteralControl(""))
            Me.divNav.Controls.AddAt(Me.divNav.Controls.Count, (lb))
        End If
    End Sub

End Class


But it's exhibiting the same behavior. I tried moving the code to both Init and Pre_Init as well, but with the same results. Do you have another suggestion?

zilonox
Newbie Poster
6 posts since May 2010
Reputation Points: 10
Solved Threads: 0
 
b'coz server side postback load whole html page and request is http so http is stateless protocol whole page request to server side that's why that's happening. the solution is use jquery or javascript....

I can do javascript programming (never tried jquery), but the actual page this snippet was taken from has a lot of server-side code already and I thought maybe I could just add this in and not have to worry about secure (that is, script-disabled) browsing.

Nothing else I'm doing with the page would interfere with the problem I'm presenting here. The HTML and VB code I provided above illustrate my problem in a stand-alone setting. Any method to correct this stand alone example would work in my real page without interfering with any thing else I'm doing on the server.

I do thank you for pointing out the javascript possibility, though. I can certainly fall back on that if I can't find an acceptable solution for the server-side.

zilonox
Newbie Poster
6 posts since May 2010
Reputation Points: 10
Solved Threads: 0
 

Well, time to give up on an elegant solution. I've resorted to using a viewstate variable and a for...next loop to handle the dynamic controls. Just in case anyone else needs a solution to a similar problem, here is what worked for me:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="test3.aspx.vb" Inherits="test3" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Dynamic Controls - PostBack Demo</title>
    </head>
    <body>
        <form id="form1" runat="server">
            <asp:PlaceHolder ID="PlaceHolder1" runat="server">
                <asp:LinkButton ID="LinkButton1" runat="server">Start</asp:LinkButton>
            </asp:PlaceHolder>
            
            <asp:Button ID="Button1" runat="server" Text="Add New Link Button" />
        </form>
    </body>
</html>


And here's the code behind:

Partial Class test3
    Inherits System.Web.UI.Page

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        Dim i As Integer
        For i = 1 To Val(ViewState("COUNT"))
            Dim txt As New LinkButton
            txt.ID = "Text" & i.ToString()
            txt.Text = i.ToString()
            PlaceHolder1.Controls.Add(New LiteralControl("&nbsp;&gt;&nbsp;"))
            PlaceHolder1.Controls.Add(txt)
        Next
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim lb As New LinkButton
        Viewstate("COUNT") += 1
        lb.ID = "Text" & ViewState("COUNT")
        lb.Text = ViewState("COUNT")
        PlaceHolder1.Controls.Add(New LiteralControl("&nbsp;&gt;&nbsp;"))
        PlaceHolder1.Controls.Add(lb)
    End Sub
End Class
zilonox
Newbie Poster
6 posts since May 2010
Reputation Points: 10
Solved Threads: 0
 

This question has already been solved

Post: Markdown Syntax: Formatting Help
You
View similar articles that have also been tagged: