ASP.Net :pourquoi les événements de clic/commande de mon bouton ne se lient/ne se déclenchent pas dans un répéteur ?

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

Question

Voici le code de l'ascx qui contient le répéteur :

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

Et dans le code-behind pour les données et les événements du répéteur :

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 le clic ni la commande ne sont appelés, qu'est-ce que je fais de mal ?

Était-ce utile?

La solution

Les contrôles imbriqués à l’intérieur des répéteurs n’interceptent pas les événements.Au lieu de cela, vous devez vous lier au Repeater.ItemCommand Événement.

ItemCommand contient RepeaterCommandEventArgs qui comporte deux champs importants :

  • NomCommande
  • CommandArgument

Alors, un exemple 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
    }
}

Autres conseils

Vous devez gérer le Événement ItemCommand sur votre répéteur.Voici un exemple.

Ensuite, vos clics sur les boutons seront gérés par la méthode ListOfEmails_ItemCommand.Je ne pense pas que le câblage de l'événement Click ou Command (du bouton) dans ItemDataBound fonctionnera.

Si vous envisagez d'utiliser l'événement ItemCommand, assurez-vous de vous inscrire à l'événement ItemCommand dans Page_Init et non dans Page_Load.

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

Je ne sais pas pourquoi cela ne fonctionnait pas pour moi avec cet événement enregistré dans Page_Load, mais le déplacer vers Page_Init m'a aidé.

Voici une expérience à essayer :

Définissez un point d'arrêt sur ListOfEmails_ItemDataBound et voyez s'il est appelé pour les publications.

Vous savez ce qui est frustrant là-dedans ?

Si vous spécifiez un OnClick dans cette balise asp:Button, la build volonté vérifiez que la méthode nommée existe dans la classe codebehind et signalez une erreur si ce n'est pas le cas...même si cette méthode ne sera jamais appelée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top