dynamically adding controls with events (but events are not firing)

S

SevDer

Hi,

I have a very simple page where I have a dynamically generated control
(panel) with child controls, but the problem is the dynamically added
control has events and they are not fired which I expect to have a recursive
page generations.

Here is my aspx.
------------------------------------------------------------
<body>
<form id="form1" runat="server">
<div>
<asp:panel ID="Panel1" runat="server" Height="54px" Width="140px">
<asp:Label ID="lTitle" runat="server" Text="My Title"></asp:Label><br />
<asp:Button ID="bPopulate" runat="server" Text="Populate Me"
OnClick="PopulateChildren" CommandArgument="1" /></asp:panel>
</div>
</form>
</body>

And here is the code behind to generate the dynamic content.
------------------------------------------------------------
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ArrayList dynamicContent;
if (Session["MyItems"] != null)
{
dynamicContent = Session["MyItems"] as ArrayList;
foreach (Panel toAddPanel in dynamicContent)
{
Page.Form.Controls.Add(toAddPanel);
}
}

}

protected void PopulateChildren(object sender, EventArgs e)
{
Button parentButton = (Button)sender;

Panel childPanel = new Panel();
childPanel.EnableViewState = true;

Label childLabel = new Label();
childLabel.Text = "Child of " +
((Label)((Panel)(parentButton).Parent).Controls[1]).Text;
childLabel.EnableViewState = true;

Literal childLiteral = new Literal();
childLiteral.Text = "<br>";
childLiteral.EnableViewState = true;

Button childButton = new Button();
childButton.Text = "Child of " + ((Button)sender).Text;
childButton.Click += new EventHandler(PopulateChildren);
childButton.EnableViewState = true;

childPanel.ID = "p" + (int.Parse(parentButton.CommandArgument) +
1).ToString();
childLabel.ID = "cl" + (int.Parse(parentButton.CommandArgument) +
1).ToString();
childLiteral.ID = "clt" + (int.Parse(parentButton.CommandArgument) +
1).ToString();
childButton.ID = "cb" + (int.Parse(parentButton.CommandArgument) +
1).ToString();

childPanel.Controls.Add(childLabel);
childPanel.Controls.Add(childLiteral);
childPanel.Controls.Add(childButton);

ArrayList dynamicContent;
if (Session["MyItems"] != null)
dynamicContent = Session["MyItems"] as ArrayList;
else
dynamicContent = new ArrayList();
dynamicContent.Add(childPanel);
Session["MyItems"] = dynamicContent;


Page.Form.Controls.Add(childPanel);


}
}

Here I am not insisting on the part that I have in Page_Load but some way I
need to persist the controls in the page and have the events from those
fired.

Can anyone guide me please?

SevDer
http://www.sevder.com
 
B

bruce barker

you can not store the dynamic controls in session. they belong to the
previous page, and becuase they hold a delegat, those pages object are
held, and events if fired, run in the old pages. this also leads to
great memory leaks.

also as every page request is a new class instance, you need to attach
event handlers.

you should store info in session that allows you to recreate the dynamic
content. you shouls also recreate at oninit, not pageload.

-- bruce (sqlwork.com)
Hi,

I have a very simple page where I have a dynamically generated control
(panel) with child controls, but the problem is the dynamically added
control has events and they are not fired which I expect to have a recursive
page generations.

Here is my aspx.
------------------------------------------------------------
<body>
<form id="form1" runat="server">
<div>
<asp:panel ID="Panel1" runat="server" Height="54px" Width="140px">
<asp:Label ID="lTitle" runat="server" Text="My Title"></asp:Label><br />
<asp:Button ID="bPopulate" runat="server" Text="Populate Me"
OnClick="PopulateChildren" CommandArgument="1" /></asp:panel>
</div>
</form>
</body>

And here is the code behind to generate the dynamic content.
------------------------------------------------------------
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
ArrayList dynamicContent;
if (Session["MyItems"] != null)
{
dynamicContent = Session["MyItems"] as ArrayList;
foreach (Panel toAddPanel in dynamicContent)
{
Page.Form.Controls.Add(toAddPanel);
}
}

}

protected void PopulateChildren(object sender, EventArgs e)
{
Button parentButton = (Button)sender;

Panel childPanel = new Panel();
childPanel.EnableViewState = true;

Label childLabel = new Label();
childLabel.Text = "Child of " +
((Label)((Panel)(parentButton).Parent).Controls[1]).Text;
childLabel.EnableViewState = true;

Literal childLiteral = new Literal();
childLiteral.Text = "<br>";
childLiteral.EnableViewState = true;

Button childButton = new Button();
childButton.Text = "Child of " + ((Button)sender).Text;
childButton.Click += new EventHandler(PopulateChildren);
childButton.EnableViewState = true;

childPanel.ID = "p" + (int.Parse(parentButton.CommandArgument) +
1).ToString();
childLabel.ID = "cl" + (int.Parse(parentButton.CommandArgument) +
1).ToString();
childLiteral.ID = "clt" + (int.Parse(parentButton.CommandArgument) +
1).ToString();
childButton.ID = "cb" + (int.Parse(parentButton.CommandArgument) +
1).ToString();

childPanel.Controls.Add(childLabel);
childPanel.Controls.Add(childLiteral);
childPanel.Controls.Add(childButton);

ArrayList dynamicContent;
if (Session["MyItems"] != null)
dynamicContent = Session["MyItems"] as ArrayList;
else
dynamicContent = new ArrayList();
dynamicContent.Add(childPanel);
Session["MyItems"] = dynamicContent;


Page.Form.Controls.Add(childPanel);


}
}

Here I am not insisting on the part that I have in Page_Load but some way I
need to persist the controls in the page and have the events from those
fired.

Can anyone guide me please?

SevDer
http://www.sevder.com
 
W

Walter Wang [MSFT]

Hi SevDer,

In addition to Bruce's reply, you may find following KBs useful:

#HOW TO: Dynamically Create Controls in ASP.NET by Using Visual C# .NET
http://support.microsoft.com/kb/317794

#HOW TO: Dynamically Create Controls in ASP.NET with Visual Basic .NET
http://support.microsoft.com/kb/317515


Regards,
Walter Wang ([email protected], remove 'online.')
Microsoft Online Community Support

==================================================
When responding to posts, please "Reply to Group" via your newsreader so
that others may learn and benefit from your issue.
==================================================

This posting is provided "AS IS" with no warranties, and confers no rights.
 

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. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,990
Messages
2,570,211
Members
46,795
Latest member
YolandaCar

Latest Threads

Top