Stewart Alan
Stewart Alan

Reputation: 1643

How can I trigger UpdatePanel from Event within a dynamically loaded UserControl?

I am writing a card game app using Ajax, c# and .NET 3.5. Due to the nature of the interface I have numerous update panels that Im trying to manage and update across various user action. I'm having problems with one though.

The players current hand is built by binding a list of Card objects to a repeater and then dynamically creating a Card UserControl and adding it to the Controls of a PlaceHolder when each item is databound. The code is roughly as follows:

On the page

<asp:UpdatePanel ID="pnlInHand" runat="server" UpdateMode="Conditional">
    <ContentTemplate>
        <asp:Repeater ID="rptInHand" runat="server" onitemdatabound="rptInHand_ItemDataBound">
            <ItemTemplate>
                <asp:PlaceHolder ID="plcInHandCard" runat="server" />
            </ItemTemplate>
        </asp:Repeater>
    </ContentTemplate>
</asp:UpdatePanel>

In code behind

protected void rptInHand_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
   Card card = (Card)e.Item.DataItem;
   PlaceHolder plcCard = (PlaceHolder)e.Item.FindControl("plcInHandCard");
   plcCard.Controls.Add(CreateCardControl());
}

private CardControl CreateCardControl()
{           
   CardControl cardControl = (CardControl)Page.LoadControl("~/UserControls/CardControl.ascx");
   //Set control properties here
   return cardControl;
}

The Card Control includes a Button. The ClickEvent for this button calls a Method of the Parent Page that needs to update a seperate UpdatePanel as well as remove the card Control from the Panel that it is sitting within.

I have two issues.

  1. When I click the Card Control Button, because it has been created as part of a repeater within an updatePanel, it no longer exists when the page is posted back and so the Click event for the button within the control never fires. I can obviously rebind the repeater on page load, but does this mean I have to essentially do this on every postback?

  2. More importantly I need a way to trigger the update of another updatepanel in the parent page when the Card control's click event is raised. Is there a way of setting a trigger on an update panel that listens out for an event within a dynamicaly loaded UserControl?

Many thanks

Stewart

Upvotes: 3

Views: 4537

Answers (3)

Dan Smith
Dan Smith

Reputation: 41

Sample code from ASP.net site that should address your point 2 problem follows.

I'll leave the translation to your code to you.

I may be misunderstanding what you are trying to do but I believe once you get this working your issue with point 2 is no longer relevant as you'll get the AJAX postback you want from your parent update panel.

Good luck!

<asp:UpdatePanel ID="UpdatePanel2" runat="server">
    <ContentTemplate>
       <asp:Repeater ID="Repeater1" runat="server" DataSourceID="SqlDataSource1"  OnItemDataBound="itemDataBound">
        <ItemTemplate>       

          <mycontrol:user ID="user1" runat="server" OnCausePostBack="user1_CausePostBack"  /> <br />
    </ItemTemplate>
    </asp:Repeater>
</ContentTemplate>

</asp:UpdatePanel>



protected void itemDataBound(object sender, RepeaterItemEventArgs e)
{
    ModalPopup_WebUserControl mw=(ModalPopup_WebUserControl)e.Item.FindControl("user1");
    AsyncPostBackTrigger at = new AsyncPostBackTrigger();
    at.ControlID = mw.ID;
    at.EventName = "CausePostBack";
    UpdatePanel2.Triggers.Add(at);
}
protected void user1_CausePostBack(object sender, EventArgs e)
{
   // do something
}

Upvotes: 1

Parv Sharma
Parv Sharma

Reputation: 12705

for point one yes u will have to do it. u will have to re create the controls for point 2 a simple updatePanel.update() would do the job insode of any event if you are using an event that was binded to a dynamically created control then u will have to rebind the event on every page postback

Upvotes: 0

user260192
user260192

Reputation:

just an idea for point 2 : what about add a property in the cardControl to set a reference to the updatepanel/s ? from there you can add triggers or call panel.update in the button event

Upvotes: 0

Related Questions