Link to home
Start Free TrialLog in
Avatar of Jens Fiederer
Jens FiedererFlag for United States of America

asked on

Catching click event inside an UpdatePanel of a User Control

I was experimenting with dynamically loaded user controls.  

For some reason, when I load (from PickListUser) my PickList control, the control is displayed reasonably - with Region.xml as given, the repeater shows two lines with a name and button on each.

However, when I click the button, ONLY the load code on my host page (PickListUser) is called (with IsPostBack==true), neither the load event nor the click event on the PickList code behind are triggered.
Picklist.ascx:
---------------------------------
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="Picklist.ascx.cs" Inherits="Picklist" %>
<input type="hidden" runat="server" ID="path" />
<input type="hidden"  runat="server" ID="parent" />
<asp:Repeater ID="Repeater1" runat="server" >
<ItemTemplate>
<asp:UpdatePanel runat="server" ID="mypanel" UpdateMode="Conditional">
<ContentTemplate>
<asp:Label runat="server" ID="name" Text='<%# Eval("Name") %>' />
<asp:Button runat="server" ID="select" Text="select"  /><br />
<asp:Label runat="server" ID="display" />
</ContentTemplate>
</asp:UpdatePanel>
</ItemTemplate>
</asp:Repeater>
 
 
Picklist.ascx.cs:
---------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Xml;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
public partial class Picklist : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            string[] elements = path.Value.Split(',');
            XmlDataSource source = new XmlDataSource();
            source.DataFile = "App_Data/" + elements[0] + ".xml";
            Repeater1.DataSource = source;
            Repeater1.DataBind();
        }
        foreach (RepeaterItem x in Repeater1.Items)
        {
            (x.Controls[1].Controls[0].Controls[3] as Button).Click += Command;
        }
    }
 
 
    protected void Command(object source, EventArgs e)
    {
        display.Text = "foo";
    }
}
 
PickListUser.aspx
---------------------------------
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PickListUser.aspx.cs" Inherits="PickListUser" %>
 
<!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></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
    User!
<asp:ScriptManager runat="server" ID="mgr" />
    </div>
    </form>
</body>
</html>
 
 
PicklistUser.ascx.cs:
---------------------------------
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
 
public partial class PickListUser : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            Control main = LoadControl("~/Picklist.ascx");
            HtmlInputHidden path = main.FindControl("path") as HtmlInputHidden;
            path.Value = "region,country,call";
            FindControl("form1").Controls.Add(main);
            mgr.RegisterAsyncPostBackControl(main);
        }
    }
}
 
 
Region.xml
---------------------------------
<?xml version="1.0" encoding="utf-8" ?>
<regions>
  <region name="america" id="1" parent="0"/>
  <region name="europe" id="2" parent="0"/>
</regions>

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of Bob Learned
Bob Learned
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Jens Fiederer

ASKER

Thanks - reloading the whole kibosh did it for me ...  to my surprise, without losing state in the items I was reloading!