Maintaining the look of dynamically added usercontrols

Discussion in 'ASP .Net Building Controls' started by Nathan Sokalski, Jun 16, 2007.

  1. I have a page which I dynamically add several usercontrols (*.ascx files) to
    using the following code:


    Public Sub Refresh()
    For Each section As DataRow In Me.GetSections().Rows
    CType(Me.FindControl("admin" & CStr(section("buttontext")).Replace(" ",
    "")), adminsection2).RefreshSection()
    Next
    End Sub

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As
    System.EventArgs) Handles Me.Load
    Dim sections As DataTable = Me.GetSections()
    For Each section As DataRow In sections.Rows
    Me.AddAdminSection(CStr(section("buttontext")))
    Next
    Me.Refresh()
    End Sub

    Private Function GetSections() As DataTable
    Dim sections As New DataTable
    Dim dataadapterSelect As New OleDbDataAdapter("SELECT buttontext FROM
    subnavigation WHERE buttontext<>'More.' AND category='" &
    Request.QueryString("category") & "' ORDER BY buttonorder",
    System.Configuration.ConfigurationManager.AppSettings("connectionstring"))
    dataadapterSelect.Fill(sections)
    Return sections
    End Function

    Private Sub AddAdminSection(ByVal section As String)
    Dim admin As adminsection2 =
    CType(Page.LoadControl("~/usercontrols/adminsection2.ascx"), adminsection2)
    admin.ID = "admin" & section.Replace(" ", "")
    admin.Section = section
    Me.form1.Controls.Add(admin)
    End Sub


    My problem is that the controls are reloaded every time, as you can see from
    the Load event. If I place the following line

    Me.AddAdminSection(CStr(section("buttontext")))

    in an If Not Me.IsPostBack() statement, then it is only loaded the first
    time and I recieve an object does not exist error every time the Refresh()
    method is called (which is reasonably often, because this is for an
    administration page where the user edits DB records). What can I do to
    maintain the look of the dynamically added controls (in other words, how can
    I avoid replacing them with every postback)? If there is any other code you
    need to see that might help, let me know. Thanks.
     
    Nathan Sokalski, Jun 16, 2007
    #1
    1. Advertisements

  2. Nathan Sokalski

    Masudur Guest

    Hi,

    Dynamically loaded controls need to be load after each post back...
    other wise dynamically loaded control's event wont work...
    Its always a good practice to load the controls in page_init event

    Thanks
    Masudur
     
    Masudur, Jun 16, 2007
    #2
    1. Advertisements

  3. Isn't there any kind of workaround? I am sure that I am not the first person
    to want to maintain the properties of dynamically loaded usercontrols
    between postbacks. Anybody have any ideas? Thanks.
     
    Nathan Sokalski, Jun 17, 2007
    #3
  4. Nathan,

    Probably Ajax, however I am seriously curious what a usercontrol for ASPNET
    has to do with ADONET.

    Cor
     
    Cor Ligthert [MVP], Jun 18, 2007
    #4
  5. Nathan Sokalski

    Miha Markic Guest

    You have to load dynamically added controls each time. Their properties are
    mantained as with static controls.
     
    Miha Markic, Jun 18, 2007
    #5
  6. The dynamically added usercontrols that I want to maintain the look of
    contain AJAX, and the reason for the postbacks is to update the data
    accessed using ADO.NET, so there are your relations to AJAX and ADO.NET. The
    main tags in the usercontrol are the following:

    <asp:panel>
    <asp:Label/>
    </asp:panel>
    <asp:panel>
    <asp:DataList>
    </asp:DataList>
    </asp:panel>
    <AJAX:CollapsiblePanelExtender/>

    (obviously the controls all have their properties, and the DataList has it's
    ItemTemplate and EditItemTemplate). The property that I am having trouble
    maintaining is the Collapsed property of the CollapsiblePanelExtender
    control. The postbacks are usually caused by eventbubbling through Button
    controls in the DataList. I haven't tried it yet, but one idea I thought
    about was to put the DataList inside an UpdatePanel. The only concerns I had
    with this idea were:

    1. In some cases, a record is moved from the DataSource of one DataList to
    the DataSource of another DataList. This would mean I would still need a way
    to update all the DataLists regardless. Any ideas to make this possibility
    work?

    2. There is one section that on the page (not in the usercontrols, but on
    the page that contains the usercontrols) that is used to add records,
    obviously causing a postback. This would cause pretty much the same
    situation as Concern #1, and would probably be solved in a similar way. Any
    ideas for this?

    The code I currently use to update the usercontrols is the following. The
    *.ascx.vb file contains the following method, which is called for all of the
    usercontrols from a method in the containing page (I removed the
    OleDbDataAdapter's SQL to keep the code short in the posting):

    Public Sub RefreshSection()
    Dim sectiontable As New DataTable
    Dim sectionadapter As New OleDbDataAdapter("",
    ConfigurationManager.AppSettings("connectionstring"))
    sectionadapter.Fill(sectiontable)
    Me.datSection.DataSource = sectiontable
    Me.datSection.DataBind()
    End Sub

    Do any of these ideas or information help give a way to solve my problem?
    Thanks.
     
    Nathan Sokalski, Jun 18, 2007
    #6
  7. Nathan,

    We have used that on our VB-Tips website, however I have not enough time to
    get a nice sample from that. Why don't you make for your self a simple
    sample only containing your problem.

    You will find that you than find the solution.

    Cor
     
    Cor Ligthert [MVP], Jun 19, 2007
    #7
  8. If it was now friday I could make the sample.


     
    Cor Ligthert [MVP], Jun 19, 2007
    #8
    1. Advertisements

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments (here). After that, you can post your question and our members will help you out.