2010-06-04 4 views
0

J'ai écrit un contrôle utilisateur qui capture une entrée utilisateur et un bouton Enregistrer pour l'enregistrer dans la base de données. J'utilise un répéteur pour rendre un certain nombre de ces contrôles sur la page - imaginez une liste de questions à choix multiples avec un bouton Enregistrer pour chaque question.ASP.NET Bouton non enfoncé (bouton dans le contrôle utilisateur qui est chargé dynamiquement dans Répéteur)

Je chargeais le contrôle de l'utilisateur à l'intérieur de l'événement ItemDataBound de répéteur comme celui-ci (code simplifié):

Protected Sub rptAssignments_ItemDataBound(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles rptAssignments.ItemDataBound 

    Dim CurrentAssignment As Assignment = DirectCast(e.Item.DataItem, Assignment) 
    Dim ctl As UA = CType(LoadControl("~\Controls\UA.ascx"), UA) 

    ctl.AssignmentID = CurrentAssignment.AssignmentID 
    ctl.Assignment = CurrentAssignment.AssignmentName 
    ctl.EnableViewState = True 

    e.Item.Controls.Add(ctl) 
End Sub 

Pour votre information, je dois charger le contrôle lors de l'exécution plutôt que de spécifier dans le ItemTemplate car un contrôle différent pourrait être utilisé pour chaque rangée.

Dans le contrôle de l'utilisateur, il y a une linkbutton comme ceci:

<asp:LinkButton ID="lbnUpdate" runat="server" Text="Update" OnClick="lbnUpdate_Click" /> 

... et un bouton clic handler comme ceci:

Protected Sub lbnUpdate_Click(ByVal sender As Object, ByVal e As EventArgs) Handles lbnUpdate.Click 
    ' my code to update the DB 
End Sub 

Le problème est que lorsque le bouton Enregistrer est cliqué, la page affiche en arrière, mais lbnUpdate_Click n'est pas appelée. L'événement Page_Load de la page elle-même s'appelle cependant.

Je devrais mentionner que le répéteur fait partie d'un contrôle utilisateur, et que le contrôle utilisateur est chargé à l'intérieur d'un autre contrôle utilisateur (c'est un site DotNetNuke qui utilise intensivement les contrôles utilisateur). Le lien bouton Enregistrer ressemble à ceci:

javascript:__doPostBack('dnn$ctr498$AssignmentsList$rptAssignments$ctl04$ctl00$lbnUpdate','') 

Répondre

2

Ce problème illustre la façon dont les formulaires Web se distinguent eux-mêmes.

Vous devez reconstituer le répéteur, soit en reliant de nouveau ou depuis viewstate, pour que les sous-contrôles déclenchent des événements. Le prix que vous payez est soit un autre voyage vers votre source de données, soit toutes les données redondantes stockées sur le client dans le viewstate. Honteux!

+0

Yay! Je rebondis le répéteur dans l'événement Page_Init, et maintenant le clic sur le bouton se déclenche dans le contrôle chargé dynamiquement. Merci. – Laurence

1

J'ai eu un problème similaire une fois que pourrait être la même chose.

En résumé, puisque vous créez dynamiquement les boutons, après la publication ils n'existent pas. Ainsi, lorsque ASP.NET Webforms recherche l'événement, il ne trouve rien.

Quand votre répéteur reçoit-il des données? Essayez de rendre les boutons à la page à nouveau dans la publication (même en tant que test) pour voir si cela fait l'affaire.

+0

Cela a du sens, merci. – Laurence

0

Les ID UserControl sont-ils identiques pour chaque publication?

+0

Oui, ils le sont. Je pense que les 2 réponses ci-dessous ont mis en évidence le problème. – Laurence

Questions connexes