我花了几个小时搜索,我无法找到问题的解决方案。标题非常罗嗦,但我认为它完全描述了我的情况。请参阅以下代码。我已经尝试在转发器的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>
答案 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;
}