Web Form User Control Event, needs to be added after page loads

Viewed 303

My application consists of a web form that someone may be pulling some information in. When that occurs, I'm loading a user control more than once, based on content, that has an ImageButton on it.

Since this is being loaded after page is already loaded, how can I get the click events to work properly. Since click events are required to be set during page_load.

Example Scenario:

Main.aspx

<form id="form1" runat="server">
    <div>
        <asp:Button ID="clicker" runat="server" Text="Click Me" />
        <asp:PlaceHolder ID="PHwfuc" runat="server"></asp:PlaceHolder>
        <asp:Label runat="server" ID="ResponseMessage"></asp:Label>
    </div>
</form>

Main.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    clicker.Click += new EventHandler(this.ButClick);
}

protected void ButClick(object sender, EventArgs e)
{
    PlaceHolder placeHolder = new PlaceHolder();

    for (int i = 0; i < 2; i++)
    {
        WFUC1 test = LoadControl("~/WebFormUserControl/WFUC1.ascx") as WFUC1;
        test.Ident = i;
        placeHolder.Controls.Add(test);
    }

    PHwfuc.Controls.Add(placeHolder);
}

WFUC1.ascx

<asp:PlaceHolder runat="server" ID="DelAddrBtn"></asp:PlaceHolder>
<asp:Label runat="server" ID="ResponseMessage"></asp:Label>
<br />

WFUC1.ascx.cs

public WFUC1()
{
    TrashIcon = new ImageButton
    {
        AlternateText = "Delete Address",
        ImageUrl = "/images/trash.png",
        ToolTip = "Delete Address",
    };

    TrashIcon.Style.Add("cursor", "pointer");
    TrashIcon.Style.Add("width", "24px");
}

private ImageButton TrashIcon { get; set; }

public int Ident { get; set; }

protected void Page_Load(object sender, EventArgs e)
{
    TrashIcon.ID = $"Delete_{Ident}";
    TrashIcon.Click += new ImageClickEventHandler(this.TrashIcon_Click);
    DelAddrBtn.Controls.Add(TrashIcon);
}

protected void TrashIcon_Click(object sender, ImageClickEventArgs e)
{
    ResponseMessage.Text = $"Use Control Got it. {Ident}";
}

EDIT For Rango

WFUC1.ascx

<asp:ImageButton runat="server" ID="TrashIcon" ImageUrl = "/images/trash.png" ToolTip = "Delete Address" OnClick="TrashIcon_Click" />
<asp:Label runat="server" ID="ResponseMessage"></asp:Label>
<br />

WFUC1.ascx.cs

public partial class WFUC1 : System.Web.UI.UserControl
{
    public int Ident { get; set; }

    protected void TrashIcon_Click(object sender, ImageClickEventArgs e)
    {
        ResponseMessage.Text = $"Use Control Got it. {Ident}";
    }
}
1 Answers

Seems, I have to reload all the controls on the main again to get the click event to execute. I accidentally made this work.

Below Project Visual Studio 2017 - No binaries, except for one image and the rest is only project code.

Main.aspx

<form id="form1" runat="server">
    <asp:Button ID="clicker" runat="server" Text="Click Me" />
    <asp:PlaceHolder ID="PHwfuc" runat="server"></asp:PlaceHolder>
    <asp:Label runat="server" ID="ResponseMessage"></asp:Label>
</form>

Main.aspx.cs

protected void Page_Load(object sender, EventArgs e)
{
    clicker.Click += new EventHandler(this.ButClick);

    if(ViewState["ButClick"] != null)
        LoadData();
}

protected void ButClick(object sender, EventArgs e)
{
    LoadData();
}

private void LoadData()
{
    PlaceHolder placeHolder = new PlaceHolder();

    for (int i = 0; i < 2; i++)
    {
        WFUC1 test = LoadControl("~/WebFormUserControl/WFUC1.ascx") as WFUC1;
        test.Ident = i;
        placeHolder.Controls.Add(test);
    }

    PHwfuc.Controls.Add(placeHolder);
    ViewState["ButClick"] = true;
}

WFUC1.ascx

<asp:ImageButton runat="server" ID="TrashIcon" ImageUrl = "/images/trash.png" ToolTip = "Delete Address" OnClick="TrashIcon_Click" />
<br />
<asp:Label runat="server" ID="ResponseMessage"></asp:Label>

WFUC1.ascx

public int Ident { get; set; }

public void TrashIcon_Click(object sender, ImageClickEventArgs e)
{
    ResponseMessage.Text = $"Use Control Got it. {Ident}";
}
Related