在ItemCommand事件问题中动态创建转发器

时间:2009-09-26 15:11:17

标签: asp.net

一个奇怪的问题 在我的页面上,我有一个占位符,我在运行时创建一个转发器 在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>  

如果您需要更多信息,请询问。

2 个答案:

答案 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;
    }
}