all groups > asp.net webcontrols > november 2003 >
You're in the

asp.net webcontrols

group:

Calendar Controls don't fire events


Calendar Controls don't fire events mark NO[at]SPAM corporatedigital.com
11/29/2003 12:22:38 PM
asp.net webcontrols: Good afternoon all.
I am creating a usercontrol (*.ascx) with a Calendar control on it.
In the Calendar's DayRender event I'm dynamically adding ImageButton
controls to cells on the calendar. For each of these image button I'm
hooking up a click event as so:

imgButton.Click += new ImageClickEventHandler(this.ImageButton_Click);

Problem is that when the user clicks on the image button my event
handler never fires. Now I think I know the reason but I don't know
the best solution. Since the controls are added too late in the page
lifecycle they aren't available when the postback happens so they
never get called. So how do I create all these ImageButton's so that
they can receive events on post back?

I've heard about bubbling events but I'm not sure how they work.
Could I a add control to my Calendar in it's DayRender event and tell
the Framework to have it's click-event be sent to the Calendar's click
event???????

Re: Calendar Controls don't fire events Jos
12/1/2003 11:23:07 AM
[quoted text, click to view]

I would suggest that on postback, you recreate the calendar in
exactly the same way as before the postback.
Then the events will fire normally.
In the event handler, you can destroy everything again and
build the final page.

--

Jos

Re: Calendar Controls don't fire events mark NO[at]SPAM corporatedigital.com
12/3/2003 8:06:34 AM
Figured it out gang. Basically it comes down to this: GIVE ALL YOUR
CONTROLS IDS!!

Basically I was creating a control dynamically in the PreRender event
and then recreating it during Postback in the Init event like this:

Pseudocode
===================
Page_OnInit
if (Session["ctrlname"] == "") Session["ctrlname"] = "a.ascx";
UserControl uc = LoadControl(Session["ctrlname"];
ud.ID = "MyControl";
Controls.Add(uc)

Page_PreRender
switch case (Session["ctrlname"]) {
case "a.ascx" {
Session["ctrlname"] = "b.ascx";
break;
}
case "b.ascx" {
Session["ctrlname"] = "c.ascx";
break;
}
}
Controls.Clear();
Controls.Add(LoadControl(Session["ctrlname"])



The problem this causes is that when you Clear() the Controls array it
doesn't reset it's control id numbering scheme to start back at zero.
So the first time this page is rendered the controls that goes "out
the door" has an id of ctrl_1 NOT ctrl_0. So during Postback when we
do a great job of recreating the control in the Init routine the
control we create has the id ctrl_0 and doesn't match the control
being posted back which is ctrl_1.

The whole solution is to hardcode an ID for your control. Here's the
new pseudocode that now works:


Pseudocode
===================
Page_OnInit
if (Session["ctrlname"] == "") Session["ctrlname"] = "a.ascx";
Controls.Add(LoadControl(Session["ctrlname"])

Page_PreRender
switch case (Session["ctrlname"]) {
case "a.ascx" {
Session["ctrlname"] = "b.ascx";
break;
}
case "b.ascx" {
Session["ctrlname"] = "c.ascx";
break;
}
}
Controls.Clear();
UserControl uc = LoadControl(Session["ctrlname"];
ud.ID = "MyControl";
AddThis Social Bookmark Button