AsyncPostBackTrigger в повторителе вне UpdatePanel

Я пытаюсь получить cbxSupplement вызвать обновление панели обновления, но я не уверен, что использую неправильно EventName или это просто невозможно сделать с CheckBox, Если я заменю CheckBox с Buttonработает нормально.

<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>

1 ответ

Решение

Поскольку CheckBox элементы управления внутри повторителя недоступны во время разработки, их необходимо зарегистрировать с помощью метода ScriptManager.RegisterAsyncPostBackControl. Этот метод требует ScriptManager либо на странице, либо на главной странице.

Создать обработчик для Repeater.OnItemCreated событие и там зарегистрировать вновь созданный CheckBox, Код следующий (обратите внимание, что CheckBox должен иметь AutoPostBack свойство установлено в 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);
}

Это должно делать то, что вы хотите.

Другие вопросы по тегам