一个奇怪的问题 在我的页面上,我有一个占位符,我在运行时创建一个转发器 在ItemTemplate中,我有一个调用repeater_ItemCommand事件的按钮。
我在repeater_ItemCommand事件的第一行设置断点,当按钮被触发时,事件按计划被调用,但在RebindRepeaters()完成后,当我再次点击按钮repeater_ItemCommand事件时未被调用! 只有当我再次单击按钮时,它才会调用,在其他情况下(这是我的页面的简单版本,在原始页面中我有更新所有的复制面板)它永远不会调用!
我的aspx代码:
<form id="form1" runat="server">
<div id="talk">
<asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder>
</div>
我的代码隐藏:
protected void Page_Init(object sender, EventArgs e)
{
RebindRepeaters();
}
void RebindRepeaters()
{
PlaceHolder1.Controls.Clear();
CreateRepeater(PlaceHolder1);
}
void CreateRepeater(Control container)
{
Repeater repeater1 = new Repeater();
repeater1.ItemCommand += new RepeaterCommandEventHandler(repeater_ItemCommand);
repeater1.ItemTemplate = Page.LoadTemplate("CommentsTemplate.ascx");
container.Controls.Add(repeater1);
repeater1.DataSource = Comment.GetCommentsP(8, 0);
repeater1.DataBind();
}
void repeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
{
switch (e.CommandName)
{
case "Edit":
RebindRepeaters();
break;
}
}
CommentsTemplate.ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="CommentsTemplate.ascx.cs" Inherits="CommentsTemplate" %>
<ul>
<li>
<div class="show">
<div class="c">
<asp:LinkButton ID="lbtnTitle" runat="server" Text='<%#Eval("EncodedTitle")%>'
CausesValidation="false" CommandName="VoteUp" OnClientClick="viewHide(this);return false;" CommandArgument='<%#Eval("ID")%>'></asp:LinkButton>
<p class="d"><%#Eval("AddedBy")%>,<%#Eval("AddedDate")%></p>
<div class="CommentBody"><%# Eval("EncodedBody") %>
</div>
</div>
<div class="userpanel">
<asp:Panel runat="server" ID="panAdmin" Visible='<%# UserCanEdit %>' style="float:left;">
<asp:ImageButton runat="server" ID="btnSelect" CommandName="Edit" CommandArgument='<%# Eval("ID") %>'
CausesValidation="false" AlternateText="Edit comment" ImageUrl="~/Images/Edit.gif" />
<asp:ImageButton runat="server" ID="btnDelete" CommandName="Delete" CommandArgument='<%# Eval("ID") %>'
CausesValidation="false" AlternateText="Delete comment" ImageUrl="~/Images/Delete.gif"
OnClientClick="if (confirm('Are you sure you want to delete this comment?') == false) return false;" />
</asp:Panel>
</div>
</div>
</li>
</ul>
如果您需要更多信息,请询问。
答案 0 :(得分:0)
您是否可以尝试覆盖createChildcontrols并在那里添加RebindRepeaters调用而不是在Page_Init中?并确保为您的转发器提供明确的ID:
Repeater repeater1 = new Repeater();
repeater1.ID = "repeater1";
如果没有id,asp.net事件处理将不知道从哪里调用事件。
答案 1 :(得分:0)
必须在每次回发时重新添加动态控件才能触发其事件。在回发上创建了一个新的控制树,动态控件不再包含在其中,因此ASP.NET无法评估更改以触发事件。
编辑:通过删除RebindRepeaters(),我能够在每次点击时触发事件。你绑定它两次,一次在这里,一次在(Page_Init):void repeater_ItemCommand(object sender, RepeaterCommandEventArgs e)
{
switch (e.CommandName)
{
case "Edit":
//RebindRepeaters();
break;
}
}