Maintaining the look of dynamically added usercontrols

  • Thread starter Thread starter Nathan Sokalski
  • Start date Start date
N

Nathan Sokalski

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.
 
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.

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
 
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,

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

Cor
 
Nathan Sokalski said:
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.

You have to load dynamically added controls each time. Their properties are
mantained as with static controls.
 
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,

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
 
If it was now friday I could make the sample.


Nathan Sokalski said:
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.
 
Back
Top