mko
mko

Reputation: 7325

AsyncPostBackTrigger in a Repeater outside UpdatePanel

I am trying to get a cbxSupplement trigger updatepanel refresh, but am not sure if I am using a wrong EventName or it is just impossible to do it with CheckBox. If I replace CheckBox with Button, it works fine.

<asp:Repeater ID="repSupplements" runat="server">
    <ItemTemplate>
        <asp:CheckBox runat="server" ID="cbxSupplement" />
    </ItemTemplate>
</asp:Repeater>
<asp:UpdatePanel runat="server" ID="up1">
    <Triggers>
        <asp:AsyncPostBackTrigger ControlID="repSupplements" EventName="CheckedChanged" />
    </Triggers>
    <ContentTemplate>
        //Get checked items
    </ContentTemplate>
</asp:UpdatePanel>

Upvotes: 4

Views: 6721

Answers (1)

Alexander Manekovskiy
Alexander Manekovskiy

Reputation: 3203

Since CheckBox controls inside repeater are not available at design time you should register them with ScriptManager.RegisterAsyncPostBackControl method. This method requires ScriptManager either on page or on master page.

Create a handler for Repeater.OnItemCreated event and there register newly created CheckBox. The code is following (note that CheckBox should have AutoPostBack property set to true):

<asp:Repeater ID="repSupplements" runat="server" 
    OnItemCreated="repSupplements_ItemCreated">
    <ItemTemplate>
        <asp:CheckBox runat="server" ID="cbxSupplement" AutoPostBack="True" />
    </ItemTemplate>
</asp:Repeater>

<asp:UpdatePanel runat="server" ID="up1">
    <Triggers>

    </Triggers>
    <ContentTemplate>
        //Get checked items
    </ContentTemplate>
</asp:UpdatePanel>

Codebehind:

protected void repSupplements_ItemCreated(object sender, RepeaterItemEventArgs e)
{
    var control = e.Item.FindControl("cbxSupplement");
    ScriptManager.GetCurrent(Page).RegisterAsyncPostBackControl(control);
}

This should do what you want.

Upvotes: 10

Related Questions