2008-09-04 10 views
2

J'ai une application web qui fonctionne avec VB et Ajax. J'utilise des panneaux de mise à jour pour éviter le "scintillement" irritant sur les publications sur le serveur. Je voudrais avoir un contrôle de bouton défini dans le panneau de mise à jour lui-même (essayé de le déplacer à l'extérieur et a eu une erreur catastrophique, donc il reste là) qui rend le panneau actuel invisible et un panneau visible. Cela fonctionne avec l'exception que le bouton doit être cliqué deux fois. Pas double-cliqué, mais cliqué une fois que cliqué à nouveau.Pourquoi un bouton de contrôle doit-il être cliqué deux fois?

Lors de la définition des points d'arrêt, j'ai découvert que le code derrière le bouton est en cours d'exécution au premier clic, mais les panneaux ne basculent pas comme prévu. Si je clique sur le même bouton OU pire encore, un bouton différent, le comportement attendu du deuxième panneau apparaît. Cependant, en cliquant sur le deuxième bouton, vous obtenez un bonus non désiré d'un troisième panneau, le troisième panneau étant rendu visible en raison du deuxième clic sur le second bouton.

Je suppose que ce comportement est dû à l'updatepanel et à sa nature Ajax. Y a-t-il un moyen d'éviter le deuxième clic? Est-ce que je mésusage le panneau de mise à jour? Je voulais vraiment utiliser une popup modale (juste à la sortie de AjaxToolKit) mais j'ai eu des problèmes avec la publication des données, j'ai donc opté pour cette approche. Toutes les idées, l'aide, même la critique seraient les bienvenues car cela m'a tourmenté assez longtemps. Merci

Répondre

1

Si vous vous débarrassez des UpdatePanels, les choses fonctionnent-elles comme prévu avec PostBacks? Les chances sont quelque chose dans votre page Load ou tout autre événement situé plus haut dans la chaîne qui "réinitialise" les choses d'une certaine façon avant qu'elles n'atteignent votre événement click. Cela pourrait-il être le cas?

0

Je l'ai déjà rencontré avant et résolu, je ne me rappelle plus comment. Je vais essayer de trouver mon ancien code et revenir vers vous. une pensée, avez-vous EnablePartialRendering activé dans votre scriptmanager? essayez peut-être d'emballer les deux conteneurs dans un troisième panneau.

0

Votre panneau de mise à jour est placé à l'intérieur des autres panneaux.

Cela devrait-il être le contraire? AFAIK seuls les contrôles dans le panneau de mise à jour seront mis à jour via l'appel AJAX.

1

Je pense que votre problème est que seul le panneau de mise à jour reçoit des données du serveur après l'exécution de la méthode. Le panneau que vous tentez de modifier est en dehors du panneau de mise à jour, de sorte qu'il ne sait pas que ses propriétés ont changé.

Vous devez effectuer une publication en pleine page ou avoir le panneau que vous souhaitez modifier dans le panneau de mise à jour.

0

Voici une solution assez simple. (J'ai eu le même problème ce matin.)

Le UpdatePanel ne peut pas rendre les choses en dehors de lui-même. Donc, comme vous l'avez remarqué, les mises à jour sont en cours, mais vous ne voyez pas le résultat.

La solution la plus simple consiste à forcer une publication complète. Vous pouvez le faire comme ceci:

protected override void OnInit(EventArgs e) 
{ 
    var scriptManager = ScriptManager.GetCurrent(this); 
    // or this.Page in a UserControl, etc. 

    scriptManager.RegisterPostBackControl(someButton); 
    scriptManager.RegisterPostBackControl(someOtherButton); 
    // etc. for each control that needs to update something outside the UpdatePanel 
} 

Cela permet encore les boutons eux-mêmes être mis à jour dans le UpdatePanel par l'Ajax (par exemple changer leur état à désactivé ou activé). La publication complète ne se produit que si les boutons sont cliqués.

0

Comme d'autres l'ont dit, un panneau de mise à jour ne met à jour que son contenu, c'est l'un des principaux avantages de l'utiliser.Panel2 et pnlPrvCmt doivent être dans votre panneau de mise à jour pour que votre méthode de clic sur le bouton fonctionne. Une autre option serait de mettre Panel2 dans un panneau de mise à jour et pnlPrvCmt dans un second panneau de mise à jour. Ensuite, tout contrôle à l'intérieur de l'un ou l'autre panneau de mise à jour entraînera l'actualisation des deux, tant que UpdateMode = Always (ce qui est par défaut).

0

Essayez d'attribuer un ID au contrôle dynamique lors de sa création.
Pour une raison quelconque, ceci est requis par .net pour qu'un contrôle dynamique fonctionne dans ce contexte.

myControl.id="newID" 
0

J'ai trouvé que cela se produise sous 2 différentes scenerios:

  1. Aucun jeu d'identification sur le contrôle. L'ID est laissé hors du balisage ou l'ID n'a pas été défini lors de la création d'un contrôle dynamique. ASP.Net utilise l'ID pour suivre les actions.

  2. Mises à jour imbriquées. Scénario: Lorsque vous utilisez une page principale, vous pouvez avoir un espace réservé de contenu que vous enveloppez dans un UpdatePanel de sorte qu'un UpdatePanel n'est pas nécessaire dans le contenu de la page. Ensuite, en développant votre page, vous pourriez, comme d'habitude, ajouter un UpdatePanel.

Questions connexes