tiempo servidor net llamar lado eventos evento ejecutar ejecucion disparar crear controles boton asp agregar asp.net vb.net .net-2.0 repeater button

asp.net - servidor - eventos de boton en c#



ASP.Net: ¿por qué los eventos click/command de mi botón no son vinculantes/disparan en un repetidor? (5)

Aquí hay un experimento para que intentes:

Establezca un punto de interrupción en ListOfEmails_ItemDataBound y vea si se está solicitando una devolución de datos.

Aquí está el código del ascx que tiene el 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 detrás de los eventos de databound y eventos 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 ni el comando son llamados, ¿qué estoy haciendo mal?


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

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

EDITAR: Markdown humedeció totalmente mi sangría, bueno, debería dejar de escribir código en este cuadro de texto de todos modos.


Necesita manejar el evento ItemCommand en su Repeater. Aquí hay un ejemplo .

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.


¿Sabes lo que es frustrante sobre esto?

Si especifica un OnClick en esa etiqueta de botón asp: la compilación verificará que el método con nombre existe en la clase codebehind e informará un error si no lo hace ... aunque nunca se invocará ese método.


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 funcionaba para mí con este evento registrado en Page_Load pero moviéndolo a Page_Init ayudado.