Re: Dynamic WebControl events...

Mark Brackett <[email protected]>
Newsgroups gmane.comp.windows.devel.dotnet.web
Message-ID <[email protected]>
I agree with most of this, but not about the Checkbox needing to be
"created even before the load event". 

The Page class (at least in ASP.NET 2.0) actually attempts to load post
data TWICE (presumably for issues such as this). The first time is after
the InitComplete event, but before PreLoad (trace shows this as
Begin/End ProcessPostData). The second time is after the Load event,
which loads any post data that couldn't be loaded on the first pass
(trace shows this as Begin/End ProcessPostData Second Try"). After the
SECOND run is when the IPostBackDataHandler.RaisePostChangedEvent gets
called (aka CheckedChanged for the Checkbox) (trace show this as
Begin/End RaiseChangedEvents). 

A quick test also proves this, as I get the CheckedChanged event with a
Checkbox created in Page_Load.

Of course, the safest and easiest route is to create dynamic controls in
PreInit to make sure you catch all aspects of the Page lifecycle.
Unfortunately, this won't work out for the OP's code because he's using
the Page.Form property (not a control reference) which doesn't get
populated until AFTER PreInit. So, in that case, Init is the earliest it
can be added (but it'd probably be easiest to just change it to
reference the form control, so this.form1.Controls.Add).

--MB

-----Original Message-----
From: Discussion of building .NET applications targeted for the Web
[mailto:[email protected]] On Behalf Of Ryan Heath
Sent: Wednesday, February 14, 2007 11:39 AM
To: [email protected]
Subject: Re: [DOTNET-WEB] Dynamic WebControl events...

To backup Paul, if you add a control in the PreRender event, you will
not receive its events at postback.

Simply because, at postback, the time the control events are raised,
the methods that will handle the control events are not bounded yet,
since you would have bound the method at the PreRender event ...

protected void Page_PreRender(object sender, EventArgs e)
{
       CheckBox cb = new CheckBox();
       cb.ID = "test";
       cb.Text = "Click Here!";
       cb.CheckedChanged += new EventHandler(cb_CheckedChanged);
       this.Form.Controls.Add(cb);
}

void cb_CheckedChanged(object sender, EventArgs e)
{
//is never called!
}

The order of page events are, partially,
- init
- load
- change evts
- click evts
- prerender

Normally, creating and binding a control is ok with in the load event,
but the Checkbox, in particular, needs to be created even before the
load event...

// Ryan

On 2/14/07, Efran Cobisi <[email protected]> wrote:
> This is incorrect.
> Control's life cycle begins after they have been added to their parent
> controls; so, even if you add a Control to another Controls collection
> in the Page PreRender event, it will still fire its postback events...
> As Stacey pointed out, setting the AutoPostback property to true will
> solve this problem.
>
> HTH,
>
> Efran Cobisi
> http://www.cobisi.com
>
> Paul van Brenk wrote:
> > You should create the checkbox in the Init event... on the postback
the
> > checkbox is created after the events are handled (ie. Too late).
> >
> > Paul
> >
> > -----Original Message-----
> > From: Discussion of building .NET applications targeted for the Web
> > [mailto:[email protected]] On Behalf Of Mike Andrews
> > Sent: Wednesday, February 14, 2007 16:51
> > To: [email protected]
> > Subject: [DOTNET-WEB] Dynamic WebControl events...
> >
> > Guys,
> >
> > I'm having problems getting an aspx page to process an event for a
> > control,
> > namely a checkbox, that was dynamically created and added to the
form.
> > Any suggestions?
> >
> > Thanks,
> > Mike
> >
> > Here's a sample of the code:
> >
> >     protected void Page_Load(object sender, EventArgs e) {
> >
> >         CheckBox cb = new CheckBox();
> >         cb.ID = "test";
> >         cb.Text = "Click Here!";
> >         cb.CheckedChanged += new EventHandler(cb_CheckedChanged);
> >         this.Form.Controls.Add(cb);
> >
> >     }
> >
> >     void cb_CheckedChanged(object sender, EventArgs e) {
> >         //Do something here
> >     }
> >
> > ===================================
> > This list is hosted by DevelopMentor(r)  http://www.develop.com
> >
> > View archives and manage your subscription(s) at
> > http://discuss.develop.com
> >
> > ===================================
> > This list is hosted by DevelopMentor(r)  http://www.develop.com
> >
> > View archives and manage your subscription(s) at
http://discuss.develop.com
> >
>
> ===================================
> This list is hosted by DevelopMentor(r)  http://www.develop.com
>
> View archives and manage your subscription(s) at
http://discuss.develop.com
>

===================================
This list is hosted by DevelopMentor(r)  http://www.develop.com

View archives and manage your subscription(s) at
http://discuss.develop.com

===================================
This list is hosted by DevelopMentor®  http://www.develop.com

View archives and manage your subscription(s) at http://discuss.develop.com
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.