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