Asp.net

ASP.Net:為什麼我的按鈕的點擊/命令事件沒有在中繼器中綁定/觸發?

  • December 14, 2018

這是來自具有中繼器的 ascx 的程式碼:

<asp:Repeater ID="ListOfEmails" runat="server" >
   <HeaderTemplate><h3>A sub-header:</h3></HeaderTemplate>
   <ItemTemplate>
       [Some other stuff is here]
       <asp:Button ID="removeEmail" runat="server" Text="X" ToolTip="remove" />
   </ItemTemplate>
</asp:Repeater>

在轉發器的數據綁定和事件的程式碼隱藏中:

Protected Sub ListOfEmails_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles ListOfEmails.ItemDataBound
   If (e.Item.ItemType = ListItemType.Item) Or (e.Item.ItemType = ListItemType.AlternatingItem) Then
       Dim removeEmail As Button = CType(e.Item.FindControl("removeEmail"), Button)
       removeEmail.CommandArgument = e.Item.ItemIndex.ToString()

       AddHandler removeEmail.Click, AddressOf removeEmail_Click
       AddHandler removeEmail.Command, AddressOf removeEmail_Command
   End If
End Sub

Sub removeEmail_Click(ByVal sender As Object, ByVal e As System.EventArgs)
   Response.Write("<h1>click</h1>")
End Sub

Sub removeEmail_Command(ByVal sender As Object, ByVal e As CommandEventArgs)
   Response.Write("<h1>command</h1>")
End Sub

點擊或命令都沒有被呼叫,我做錯了什麼?

嵌套在中繼器內的控制項不會攔截事件。相反,您需要綁定到Repeater.ItemCommand事件。

ItemCommand包含RepeaterCommandEventArgs其中有兩個重要欄位:

  • 命令名
  • 命令參數

所以,一個簡單的例子:

void rptr_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
   if (e.Item.ItemType == ListItemType.AlternatingItem || e.Item.ItemType == ListItemType.Item)
   {
       // Stuff to databind
       Button myButton = (Button)e.Item.FindControl("myButton");

       myButton.CommandName = "Add";
       myButton.CommandArgument = "Some Identifying Argument";
   }
}

void rptr_ItemCommand(object source, RepeaterCommandEventArgs e)
{
   if (e.CommandName == "Add")
   {
       // Do your event
   }
}

引用自:https://stackoverflow.com/questions/42396