ASP.Net:¿por qué mi click del botón/eventos del comando no vinculante/despido en un repetidor?

StackOverflow https://stackoverflow.com/questions/42396

Pregunta

Aquí está el código de la 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 subyacente para el repetidor de enlace de datos y eventos:

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 el comando es recibir llamadas, ¿qué estoy haciendo mal?

¿Fue útil?

Solución

Controles anidado dentro de los Repetidores no interceptar los eventos.En su lugar usted necesita para unirse a la Repeater.ItemCommand Evento.

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

Otros consejos

Usted necesita para manejar la ItemCommand evento en el Repetidor.Aquí un ejemplo.

A continuación, el botón de clics será manejado por el ListOfEmails_ItemCommand método.No creo que el cableado hasta el Clic o Comando (de botón) en ItemDataBound de trabajo.

Si usted está planeando utilizar ItemCommand evento, asegúrese de que usted se inscribe para ItemCommand evento en Page_Init no en el 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 funcionando para mí con este evento registrado en el Page_Load pero moviéndose a Page_Init ayudado.

He aquí un experimento para probar:

Establezca un punto de interrupción en ListOfEmails_ItemDataBound y ver si está siendo llamado para que las devoluciones.

Usted sabe lo frustrante acerca de esto?

Si se especifica un OnClick en que asp:Button, el construir se compruebe que el nombre de método existe en el código subyacente de la clase, y el informe de un error si no...aunque ese método nunca será llamado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top