Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > ASP .Net > dynamically adding controls with events (but events are not firing)

Reply
Thread Tools

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

 
 
SevDer
Guest
Posts: n/a
 
      11-13-2007
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>
<aspanel 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" /></aspanel>
</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


 
Reply With Quote
 
 
 
 
bruce barker
Guest
Posts: n/a
 
      11-13-2007
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)

SevDer wrote:
> 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>
> <aspanel 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" /></aspanel>
> </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
>
>

 
Reply With Quote
 
 
 
 
Walter Wang [MSFT]
Guest
Posts: n/a
 
      11-13-2007
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 ((E-Mail Removed), 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.

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Dynamically adding onmouseover, onmouseout events not working Steve Macleod Javascript 2 05-20-2006 07:01 PM
Dynamically Created Controls Not Firing Events Robert Sheppard ASP .Net Web Controls 1 10-28-2005 07:30 PM
Adding events to dynamically created controls JezB ASP .Net 2 06-18-2004 02:54 PM
Dynamically adding different controls to different rows in DataGrid does not work Jonas ASP .Net Datagrid Control 0 09-23-2003 02:52 PM
Event not firing. Adding controls dynamically to UserControl nitin ASP .Net Building Controls 5 07-23-2003 09:18 PM



Advertisments