So on the funnest programmin’ site evar someone had asked how to allow an UpdatePanel on a page handle an event of a UserControl. So here’s the situation:
Let’s say you have a UserControl and on that UserControl you have a DropDownList. I know, this is getting complex, but just bare with me. Now imagine, if you will, you want the Parent page’s UpdatePanel to trigger off of the mentioned DropDownList. As it stands, this isn’t going to happen. Why? Because the Parent really can’t capture the event firing on the control since it is localized to the UserControl. What to do? Easy, just pass the event on.
public partial class CatchMyEvent : UserControl
{
public delegate void ChangedIndex(object sender, EventArgs e);
public event ChangedIndex SelectedIndexChanged;
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
dropDownListThrow.SelectedIndexChanged +=
new EventHandler(dropDownListThrow_SelectedIndexChanged);
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
}
public void dropDownListThrow_SelectedIndexChanged(object sender, EventArgs e)
{
if(SelectedIndexChanged != null)
{
SelectedIndexChanged(sender, e);
}
}
}
As you can see, all I’ve done
- Created a PUBLIC delegate and event that has the same signature as the SelectedIndexChanged event
- Captured the SelectedIndexChanged event in the UserControl
- Fired off the created event
It’s like I’m just handing off the event firing to the next guy, the next guy being the Parent page in this instance. Now the code behind for the Parent page is really simple:
public partial class Catcher : Page
{
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
catchMyEventMain.SelectedIndexChanged += dropDownListThrow_SelectedIndexChanged;
}
public void dropDownListThrow_SelectedIndexChanged(object sender, EventArgs e)
{
labelSelectedValue.Text = ((DropDownList)sender).SelectedItem.Text;
}
}
As you can see, the Parent now is also looking for the DropDownList SelectedIndexChanged event to fire, except we both know that it’s not the official SelectedIndexChanged event, but an event that is merely passing on the information. Now for the Parent page markup:
<asp:ScriptManager ID="smMain" runat="server" />
<asp:UpdatePanel ID="upMain" runat="server" >
<Triggers>
<asp:AsyncPostBackTrigger ControlID="catchMyEventMain" EventName="SelectedIndexChanged" />
</Triggers>
<ContentTemplate>
<uc1:CatchMyEvent ID="catchMyEventMain" runat="server" />
<asp:Label ID="labelSelectedValue" runat="server" />
</ContentTemplate>
</asp:UpdatePanel>
So in all this will update a label’s text on the Parent page to equal that of the SelectedItem.Value of the DropDownList of the UserControl. And all without the annoying page refresh.
Just remember, the DropDownList has to have AutoPostback set to true. Don’t be dumb like me and forget that when testing.