L'ajout de PostBackTriggers et AsyncPostBackTriggers à UpdatePanel pour générées dynamiquement petit-contrôles
J'ai une page avec un ScriptManager, un générique HTML liste déroulante (<select>
), et un UpdatePanel. L'UpdatePanel contient un espace Réservé (pour l'instant). Au cours de Page_Load, un certain nombre de contrôles utilisateur sont ajoutés à l'espace Réservé (vraiment, c'est plusieurs instances de la même contrôle de l'utilisateur). Le nombre à ajouter n'est pas connue jusqu'à ce que le chargement de la page, de sorte qu'ils ne doivent être chargés dynamiquement. La liste déroulante est rempli avec le même nombre d'éléments de menu, et il y a du javascript sur la page également (à l'aide de jQuery) pour afficher uniquement les commandes à l'heure en fonction de l'état de la liste déroulante.
Chaque utilisateur de contrôle dispose de deux boutons qui devrait générer une publication asynchrone, une liste déroulante qui devrait générer une publication asynchrone sur un changement de la valeur sélectionnée, et un bouton qui devrait générer un synchrone de publication. Si je n'étais pas générer les contrôles dynamiquement, et si il n'y avait qu'un seul contrôle, la structure serait quelque chose comme:
<asp:UpdatePanel ID="myUpdatePanel" runat="server" UpdateMode="Conditional"
ChildrenAsTriggers="false">
<ContentTemplate>
<asp:TextBox ID="textBox1" runat="server" />
<asp:TextBox ID="textBox2" runat="server" />
<asp:Button ID="asyncButton1" runat="server" Text="Button1"
onclick="asyncButton1_Click" />
<asp:DropDownList ID="asyncDropDown" ruant="server" AutoPostBack="true"
OnSelectedIndexChanged="asyncDropDown_SelectedIndexChanged" />
<asp:Button ID="asyncButton2" runat="server" Text="Button2"
OnClick="asyncButton2_Click" />
<asp:Button ID="syncButton" runat="server" Text="SyncButton"
OnClick="syncButton_Click" />
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="asyncButton1" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="asyncButton2" EventName="Click" />
<asp:AsyncPostBackTrigger ControlID="asyncDropDown"
EventName="SelectedIndexChanged" />
<asp:PostBackTrigger ControlID="syncButton" />
</Triggers>
</asp:UpdatePanel>
Bien sûr, tous les contrôles à l'intérieur de la ContentTemplate serait en fait une partie de chaque contrôle de l'utilisateur.
Ajoutant les déclencheurs sur le côté serveur ne semble pas fonctionner, car aucune ControlID semble pour aider à l'UpdatePanel trouver les contrôles pertinents. Je peux utiliser l'ID du contrôle ou le contrôle de l'id unique, et il ne fonctionne pas, et j'obtiens une erreur le long de la lignes de
A control with ID 'ctl00$ContentPlaceHolder1$ctl01$asyncButton1' could not be
found for the trigger in UpdatePanel 'myUpdatePanel'.
Alors, je me demande si j'ai besoin d'enregistrer les déclencheurs dans le client au lieu d'utiliser ASP.NET Ajax. J'ai trouvé cette page que, fondamentalement, explique comment. Cependant, je ne sais pas comment pour obtenir le EventName pris en considération. Les exemples que j'ai vu jusqu'à présent ont tout simplement été l'ajout de clics sur le bouton, mais je ne sais pas comment gérer l'événement SelectedIndexChanged à partir de la liste déroulante.
Toute l'aide ici? Existe-il des exemples là-bas que j'ai raté? Cela n'aide pas, bien sûr, que la méthode dans le lien que j'ai donné semble être "non officiel", donc je ne vois pas de MSDN de documents sur le sujet.
Merci!
Non, ce doit être .NET 3.5 pour l'instant.
tagged as 3.5. Je vais aller pour voir de plus près plus tard.
OriginalL'auteur Andrew | 2011-01-20
Vous devez vous connecter pour publier un commentaire.
Ma suggestion serait de tirer toutes vos commandes inclus cette UpdatePanel de ce UpdatePanel dans un UserControl. Définir les événements dans votre usercontrol qui sont soulevées lorsque l'utilisateur clique sur les boutons ou la liste Déroulante de l'index sélectionné pour se changer. Poignée de ces événements dans votre page qui contient l'espace Réservé(dans un seul UpdatePanel,conditionnel,sans déclencheurs). Appeler la mise à Jour de la méthode de la principale panneau de mise à jour manuellement si vous ajoutez des UserControls.
Pour clarifier ce que je veux dire avoir un coup d'oeil à l'exemple suivant:
Principal-page aspx:
Le code-behind:
ascx qui détient vos commandes:
Le code-behind de UserControl:
De cette manière vous n'aurez pas de problèmes avec ClientID.
Plus:
Si vous avez besoin d'accéder aux commandes de votre UserControls dans le cas des gestionnaires, utilisez l'une des deux options suivantes:
Dim uc As DynamicControls = DirectCast(DirectCast(sender, Control).NamingContainer, DynamicControls)
remplacer toutes les occurences de
(ByVal sender As Object, ByVal e As System.EventArgs)
avec(uc as DynamicControls)
. De cette manière, la référence de votre UserControl est ajouté à l'événement en tant que paramètre et vous pouvez avoir accès à des propriétés publiques de la page, f.e.:Si vous avez exposé une propriété Texte1 dans le contrôle UserControl:
La deuxième option est la plus propre et la plus lisible.
Mise à jour:
En fonction de votre commentaire: vous devez placer les UpdateProgress dans le contrôle UserControl à l'intérieur de l'UpdatePanel qui est mis à jour. N'oubliez pas de régler le AssociatedUpdatePanelID correctement. Par exemple:
j'ai mis à jour ma réponse avec un exemple(pour simplifier, sans contenu)qui fonctionne pour moi. Il dispose de deux updatepanels à l'intérieur d'un UserControl. L'ajuster à vos besoins.
Merci pour l'aide!
OriginalL'auteur Rango