2008-09-03 5 views
9

Aquí está el código de la ascx que tiene el repetidor:ASP.Net: ¿por qué los eventos click/command de mi botón no son vinculantes/disparan en un repetidor?

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

Y en el código subyacente para los eventos de enlace de datos y del repetidor:

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 

Ni el clic o comando es conseguir llaman, ¿qué soy yo haciendo mal?

Respuesta

15

Los controles anidados dentro de Repetidores no interceptan eventos. En su lugar, debe vincularse al evento Repeater.ItemCommand.

ItemCommand contiene RepeaterCommandEventArgs que tiene dos campos importantes:

  • CommandName
  • CommandArgument

Así, un ejemplo trivial:

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 
      } 
     } 

EDIT: Markdown totalmente manguera mi muesca , bueno, debería dejar de escribir código en th es cuadro de texto de todos modos.

0

Aquí hay un experimento para probar:

un punto de ruptura en ListOfEmails_ItemDataBound y ver si está siendo llamado para las devoluciones de datos.

+1

¿por qué? ¿Podrías elaborar? Realmente no creo que esto cuente como una "respuesta", quizás debería haber agregado esto como un "comentario". – hofnarwillie

4

Necesita manejar el ItemCommand event en su repetidor. Aquí está an example.

Luego, los clics de sus botones serán manejados por el método ListOfEmails_ItemCommand. No creo que el cableado del evento Clic o Comando (del botón) en ItemDataBound funcione.

0

¿Sabes lo que es frustrante de esto?

Si especifica un OnClick en ese asp: Etiqueta de botón, la acumulación se comprobar que existe el método llamado en la clase de código subyacente, e informar de un error si no lo hace ... a pesar de que el método nunca lo hará ser llamado.

2

Si planea utilizar el evento ItemCommand, asegúrese de registrarse en el evento ItemCommand en Page_Init y no en Page_Load.

protected void Page_Init(object sender, EventArgs e) 
{ 
    // rptr is your repeater's name 
    rptr.ItemCommand += new RepeaterCommandEventHandler(rptr_ItemCommand); 
} 

No estoy seguro de por qué no estaba trabajando para mí con este evento registrado en Load pero moviéndolo a Page_Init ayudado.

Cuestiones relacionadas