UpdatePanel RadioButtonList AsyncPostback EventHandler丢失

时间:2017-11-26 20:38:48

标签: c# updatepanel postback repeater eventhandler

我花了几个小时搜索,我无法找到问题的解决方案。标题非常罗嗦,但我认为它完全描述了我的情况。请参阅以下代码。我已经尝试在转发器的ItemDataBound事件上添加SelectedIndexChanged函数,但似乎回发事件会导致页面忘记处理程序。使用Triggers.Add添加AsyncPostbackTrigger也是如此。

有效的解决方案是在回发时重新添加EventHandler,但这对我来说不是一个可行的解决方案。我可以编写一个自定义函数来循环遍历我的转发器DataSource,而不依赖于实际的DataBinding,然后在适用时专门重新绑定EventHandler,但这似乎是一种非常强力的方法。有没有更好的方法来实现我的目标?

前端:

get_queryset()

后端:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
        <asp:ScriptManager ID="smMain" runat="server" />
        <div>
            <asp:UpdatePanel ID="updTest" runat="server" UpdateMode="Conditional">
                <ContentTemplate>
                    <asp:Repeater ID="rptTest" runat="server" OnItemDataBound="rptTest_ItemDataBound">
                        <ItemTemplate>
                            <asp:RadioButtonList ID="rblTest" runat="server" RepeatDirection="Horizontal" ClientIDMode="AutoID" />
                        </ItemTemplate>
                    </asp:Repeater>
                </ContentTemplate>
            </asp:UpdatePanel>
        </div>
    </form>
</body>
</html>

1 个答案:

答案 0 :(得分:0)

找到问题的解决方案。本质上,我需要在ItemCreated事件上绑定EventHandler,而不是在ItemDataBound事件上绑定。每个回发都会触发ItemCreated事件,而不仅仅是第一个事件,因此可以正确地重新绑定EventHandler。

前端:

<asp:Repeater ID="rptTest" runat="server" OnItemCreated="rptTest_ItemCreated" OnItemDataBound="rptTest_ItemDataBound">

后端:

protected void rptTest_ItemCreated(object sender, RepeaterItemEventArgs e)
{
    RadioButtonList rbl = (RadioButtonList)e.Item.FindControl("rblTest");

    rbl.SelectedIndexChanged += testFunction;
}