J'ai créé un contrôle utilisateur Web appelé Activité. J'ai défini un événement public sur ce contrôle utilisateur Web appelé OnActivityDelete. Il y a un bouton de suppression dans le contrôle d'activité. Lorsque le bouton Supprimer est cliqué, le contrôle d'activité déclenche l'événement OnActivityDelete. J'utilise ce contrôle de l'utilisateur Web dans un répéteur. J'assigne un gestionnaire d'événement à l'événement OnActivityDelete sur l'événement lié aux données d'élément du répéteur. Lorsque je clique sur le bouton Supprimer du contrôle d'activité, l'événement se déclenche à partir du contrôle d'activité, mais il ne frappe jamais le gestionnaire d'événements dans la page qui utilise le contrôle. (J'ai entré dans le code avec le débogueur et confirmé ce comportement). Je soupçonne que ce comportement a quelque chose à voir avec le fait que les gestionnaires d'événements sont ajoutés dans le code lorsque je lie le répéteur à une source de données, ce que je fais seulement si la page n'est pas postée.Événements de contrôle d'utilisateur Web ASP .NET
Est-il possible de définir le gestionnaire d'événements pour le contrôle d'activité dans le balisage de la page ASPX? Si oui, cela résoudra-t-il mon problème? Si ce n'est pas le cas, dois-je lier le répéteur et connecter les événements à chaque chargement de page afin de résoudre mon problème (cela fonctionne, je viens de le tester), ou y a-t-il un truc pour voir les événements persister?
balisage du répéteur à la page:
<asp:Repeater ID="rptrActivites" runat="server" EnableViewState="true">
<ItemTemplate>
<div class="activity">
<crm:Activity ID="activityView" runat="server" Activity="<%#Container.DataItem %>" EnableViewState="true" />
</div>
</ItemTemplate>
</asp:Repeater>
Code de la page derrière:
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
If Not Page.IsPostBack Then
GetActivities()
End If
End Sub
Private Sub GetActivities()
Dim oDS As DataSet
'Code removed for brevity'
rptrActivites.DataSource = oDataView
rptrActivites.DataBind()
End Sub
Private Sub rptrActivites_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptrActivites.ItemDataBound
If e.Item.ItemType = ListItemType.Item Or e.Item.ItemType = ListItemType.AlternatingItem Then
Dim activityView As Activity = e.Item.FindControl("activityView")
If activityView IsNot Nothing Then
AddHandler activityView.OnActivityDelete, AddressOf ActivityDelete
End If
End If
End Sub
Private Sub ActivityDelete(ByVal sender As Object, ByVal e As ActivityDeleteEventArgs)
'This never fires'
End Sub
Le balisage du contrôle de l'activité:
<%@ Control Language="vb" AutoEventWireup="false" CodeBehind="Activity.ascx.vb" Inherits=".Activity" %>
<!-- code removed for brevity's sake -->
<asp:LinkButton ID="btnDelete" runat="server" Text="Delete" />
<!-- code removed for brevity's sake -->
code de contrôle de l'activité derrière:
Public Event OnActivityDelete(ByVal sender As Object, ByVal e As ActivityDeleteEventArgs)
Private Sub btnDelete_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnDelete.Click
RaiseEvent OnActivityDelete(Me, New ActivityDeleteEventArgs())
End Sub
Essayez de connecter le gestionnaire d'événements dans l'événement ItemCreated du répéteur. Les éléments sont liés une seule fois (lorsque la page n'est pas postée dans votre exemple) mais ils sont créés chaque fois que la page est chargée. A propos de l'attachement de l'événement au balisage: Je ne l'ai pas testé mais je pense que cela peut être fait et que vous pouvez l'essayer, mais assurez-vous que la méthode ActivityDelete (celle de la page) est protégée ou publique. – Padel
Padel, c'est public, mais je ne semble pas avoir l'option d'assigner l'évènement dans le balisage. –