2010-06-24 6 views
0

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

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

+0

Padel, c'est public, mais je ne semble pas avoir l'option d'assigner l'évènement dans le balisage. –

Répondre

1

Vous avez à peu près répondu à votre propre question. Pour qu'un événement soit déclenché pendant le cycle de vie de la page, le serveur doit être capable de recréer systématiquement tous les contrôles qui étaient disponibles pour le client à chaque fois. Cela est dû au fait que les contrôles d'origine doivent être créés avant que le serveur puisse charger leur état viewstate, puis identifier les modifications survenues du côté client. Une fois les modifications identifiées, le serveur mappera les modifications aux événements appropriés et les déclenchera selon les besoins.

Il semble que vos contrôles ne soient pas créés de manière cohérente à chaque rendu de page et, par conséquent, l'événement est perdu car il ne peut pas être attaché au contrôle d'origine.

Une chose que vous pouvez essayer est de placer votre source de données Repeaters dans une propriété viewstate/server. De cette façon, vous n'avez qu'à récupérer les données à lier une fois sur Page.IsPostBack et pouvez ensuite relier le répéteur à chaque chargement de page de manière cohérente. Cela devrait alors permettre à votre page d'identifier la source de contrôle d'origine de l'événement en cours d'exécution, de l'attacher puis de traiter la demande.

Questions connexes