Re: Dynamic WebControl events...
Mike Andrews <[email protected]>
| Newsgroups | gmane.comp.windows.devel.dotnet.web |
|---|---|
| Message-ID | <[email protected]> |
WOW! I'm impressed. I admit I was quite skeptical this morning when I tried out your solution, but low and behold it worked! I spent all day yesterday fiddling with this thing! Thanks a lot. That works quite well. Mike On 2/15/07, Efran Cobisi <[email protected]> wrote: > > Mike, I got it. > This is not an UpdatePanel issue (at least your code is not showing it), > you can leave it there. Here are the steps you should follow to make > this page works: > > 1) On the markup (.aspx page) set the Repeater rpt1 EnableViewState > property to true. This one will retain the state between postbacks and > will let you catch change events correctly. > 2) Move the initialization code from the Page Load event to the Page > *Init* event (you can just rename the Page_Load method to Page_Init, > since you are using the AutoEventWireup feature...). This will let you > initialize the controls *before* the they have their state loaded, so > the state would eventually update the original initialization on each > postback. > 3) Since you are using an UpdatePanel you should limit the interaction > with the page to the controls inside the panel itself. So, if you want > to give a feedback upon checkboxes changes you should place a control, > say a Label, inside the UpdatePanel. Inside the cb_CheckedChanged method > just set the Label text to something useful. For example: > > void cb_CheckedChanged(object sender, EventArgs e) > { > label1.Text += String.Format("{0} state changed.<br />" + > ((Control)sender).ID); > } > > HTH, > > Efran Cobisi > http://www.cobisi.com > > Mike Andrews wrote: > > We have an UpdatePanel and that contains the Repeater. > > It's becoming a real problem for this page we need to make. > > > > > > On 2/14/07, Mark Brackett <[email protected]> wrote: > >> > >> Perhaps try without the UpdatePanel? I don't see anything that jumps > out > >> at me as being a problem with normal ASP.NET...but, I haven't really > >> worked with Atlas. > >> > >> --MB > >> > >> -----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 1:06 PM > >> To: [email protected] > >> Subject: Re: [DOTNET-WEB] Dynamic WebControl events... > >> > >> Hey guys... > >> Thank you so much for the responses... > >> However, after some further research into this problem here's what's > >> going > >> on. Perhaps one of you know what the issue could be. We are using a > >> repeater (actually 3 nested repeaters) to dynamically build some forms. > >> I've been able to deduce these things with dynamic check boxes > contained > >> within repeaters: > >> > >> 1) When you check a checkbox, all previously checked checkboxes fire > >> their > >> CheckedChanged event. > >> 2) When you uncheck a checkbox, all previously checked checkboxes fire > >> their CheckedChanged event and the one unchecked does not fire the > >> CheckedChanged event. > >> > >> Any assistance would be most appreciated. > >> > >> Thanks, > >> Mike > >> > >> Here's the markup code for the sample page: > >> > >> <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Test2.aspx.cs" > >> Inherits="Test2" %> > >> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" " > >> http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> > >> <html xmlns="http://www.w3.org/1999/xhtml" > > >> <head runat="server"> > >> <title>Untitled Page</title> > >> </head> > >> <body> > >> <form id="form1" runat="server"> > >> <div> > >> <asp:ScriptManager ID="scriptManater" > >> runat="server"></asp:ScriptManager> > >> <asp:UpdatePanel ID="pnlUpdate" runat="server"> > >> <ContentTemplate> > >> <asp:Repeater ID="rpt1" runat="server" > >> EnableViewState="false"> > >> <ItemTemplate> > >> <asp:PlaceHolder ID="ph1" > >> runat="server"></asp:PlaceHolder> > >> </ItemTemplate> > >> </asp:Repeater> > >> </ContentTemplate> > >> </asp:UpdatePanel> > >> </div> > >> </form> > >> </body> > >> </html> > >> > >> Here's the codebehind for the sample page: > >> > >> using System; > >> using System.Data; > >> using System.Configuration; > >> using System.Collections; > >> using System.Web; > >> using System.Web.Security; > >> using System.Web.UI; > >> using System.Web.UI.WebControls; > >> using System.Web.UI.WebControls.WebParts; > >> using System.Web.UI.HtmlControls; > >> using System.Collections.Generic; > >> > >> public partial class Test2 : System.Web.UI.Page { > >> protected void Page_Load(object sender, EventArgs e) { > >> > >> List<System.Web.UI.Control> controls = new List<Control>(); > >> > >> CheckBox cb = null; > >> cb = new CheckBox(); > >> cb.ID = "test"; > >> cb.Text = "Click Here!"; > >> cb.AutoPostBack = true; > >> cb.CheckedChanged += new EventHandler(cb_CheckedChanged); > >> controls.Add(cb); > >> > >> cb = new CheckBox(); > >> cb.ID = "test2"; > >> cb.Text = "Click Here Again!"; > >> cb.AutoPostBack = true; > >> cb.CheckedChanged += new EventHandler(cb_CheckedChanged); > >> controls.Add(cb); > >> > >> rpt1.ItemCreated += new > >> RepeaterItemEventHandler(rpt1_ItemCreated); > >> rpt1.DataSource = controls; > >> rpt1.DataBind(); > >> > >> } > >> > >> void rpt1_ItemCreated(object sender, RepeaterItemEventArgs e) { > >> if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == > >> ListItemType.AlternatingItem) { > >> PlaceHolder ph = (PlaceHolder)e.Item.FindControl("ph1"); > >> CheckBox cb = (CheckBox)e.Item.DataItem; > >> ph.Controls.Add(cb); > >> } > >> } > >> > >> void cb_CheckedChanged(object sender, EventArgs e) { > >> > >> } > >> } > >> > >> > >> > >> On 2/14/07, Mark Brackett <[email protected]> wrote: > >> > > >> > 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.RaisePostChangedEventgets > >> > 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(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 > > =================================== > This list is hosted by DevelopMentor� http://www.develop.com > > View archives and manage your subscription(s) at > http://discuss.develop.com >