2009-09-26 61 views
1

一個奇怪的問題。
在我的頁面上,我有一個佔位符,我在運行時創建一箇中繼器。
在ItemTemplate中,我有一個調用repeater_ItemCommand事件的按鈕。動態創建的中繼器和ItemCommand事件問題

我把一個斷點repeater_ItemCommand事件的第一線,當按鈕被觸發的情況下按計劃進行, RebindRepeaters()之後被調用完成後,當我上的按鈕再次repeater_ItemCommand事件不調用點擊! 只有當我再次點擊按鈕時,它纔會調用,在其他情況下(這是我的頁面的簡單版本,在原始頁面中,我擁有更復雜的updatepanel),它永遠不會調用!

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

CommentsTemplate.ascx是什麼樣的?你能告訴我們來源嗎? –

+0

當然,我認爲它不相關 – dani

回答

0

你可以嘗試overidding createChildcontrols並添加RebindRepeaters調用,而不是在Page_Init?並確保給你的中繼器一個明確的ID:

Repeater repeater1 = new Repeater(); 
repeater1.ID = "repeater1"; 

沒有一個id的asp.net事件處理將不知道從哪裏調用事件。

+0

給出特定的ID存在問題,因爲在我的整個頁面上,我創建了嵌套中繼器(n級)。 爲什麼我需要createChildcontrols? page_init有什麼問題? – dani

+0

CreateChildControls在asp.net頁面生命週期的正確時刻被調用。如果你創建嵌套中繼器,你可以使用一個使用頁面級別repeaterlevel Property的方法來跟蹤你的級別,所以當你添加一個嵌套的中繼器並使用ID中的值時,你可以增加它? – Colin

0

每次回傳都必須重新添加動態控件才能觸發事件。回發中正在創建新的控件樹,並且動態控件不再存在,因此ASP.NET無法評估更改以觸發事件。

編輯:我能夠通過刪除RebindRepeaters()每次點擊事件觸發事件。你綁定了兩次,一次在這裏和一次(Page_Init):

void repeater_ItemCommand(object sender, RepeaterCommandEventArgs e) 
{ 
    switch (e.CommandName) 
    {       
     case "Edit":    
      //RebindRepeaters(); 
      break; 
    } 
} 
+0

那麼你有什麼建議? – dani

+0

測試了您的源代碼,請參閱上面的編輯。 –