2008-09-04 14 views
2

Ich habe eine Webanwendung, die mit VB und Ajax funktioniert. Ich benutze Updatepanels, um das irritierende "Flimmern" bei Postbacks auf dem Server zu vermeiden.Warum muss ein Button-Steuerelement zweimal geklickt werden?

Ich hätte gerne eine Schaltfläche Steuerelement im Updatepanel selbst definiert (versucht, es nach außen zu verschieben und einige katastrophale Fehler, so dass es dort gelassen), die das aktuelle Panel nicht sichtbar und ein Geschwister-Panel sichtbar macht. Dies funktioniert mit der Ausnahme, dass die Schaltfläche zweimal angeklickt werden muss. Nicht doppelt geklickt, aber einmal geklickt, dann erneut geklickt.

Bei der Einstellung von Breakpoints habe ich festgestellt, dass der Code hinter dem an die Schaltfläche angefügten Button beim ersten Klick tatsächlich ausgeführt wird, aber die Panels nicht wie erwartet wechseln. Wenn ich auf die gleiche Schaltfläche ODER noch schlimmer, eine andere Schaltfläche klicke, tritt das erwartete Verhalten der zweiten Anzeige auf. Wenn jedoch die zweite Schaltfläche angeklickt wird, gibt es einen unerwünschten Bonus, dass eine dritte Anzeige angezeigt wird, wobei die dritte Anzeige durch das Klicken auf die zweite Schaltfläche sichtbar gemacht wird.

Ich gehe davon aus, dass dieses Verhalten auf das Updatepanel und seine Ajax Natur zurückzuführen ist. Gibt es eine Möglichkeit, den zweiten Klick zu vermeiden? Missbrauche ich das Updatepanel? Ich wollte wirklich ein modales Popup (direkt aus dem AjaxToolKit) verwenden, hatte aber Probleme mit dem Zurücksetzen der Daten, also entschied ich mich für diesen Ansatz. Irgendwelche Einsichten, Hilfe, sogar Kritik wären willkommen, denn das hat mich lange genug geplagt. Danke

Antwort

1

Wenn Sie die UpdatePanels loswerden funktionieren die Dinge wie erwartet mit PostBacks? Chancen sind etwas in deinem Page_Load oder einem anderen Ereignis in der Kette, das Dinge auf irgendeine Weise "zurücksetzt", bevor es zu deinem Klickereignis kommt. Könnte das der Fall sein?

0

Ich bin schon mal darauf gestoßen und habe es gelöst, ich kann mich einfach nicht mehr daran erinnern. Ich werde versuchen, meinen alten Code zu finden und zu dir zurück zu kommen. Ein Gedanke, haben Sie EnablePartialRendering in Ihrem Scriptmanager aktiviert? Versuchen Sie vielleicht, beide Container in einem dritten Panel zu verpacken.

0

Ihr Update-Panel befindet sich innerhalb der anderen Panels.

Sollte das anders herum sein? AFAIK-Steuerungen, die nur innerhalb des Update-Panels verfügbar sind, werden über den AJAX-Aufruf aktualisiert.

1

Ich denke Ihr Problem ist, dass nur das Update-Panel Daten vom Server empfängt, nachdem die Methode ausgeführt wurde. Der Bereich, den Sie ändern möchten, befindet sich außerhalb des Aktualisierungsbereichs, sodass er nicht weiß, dass sich seine Eigenschaften geändert haben.

Sie müssen entweder einen vollständigen Seitenpostback ausführen oder das Bedienfeld, das Sie ändern möchten, im Aktualisierungsfenster anzeigen.

0

Hier ist eine ziemlich einfache Lösung. (Ich hatte das gleiche Problem heute Morgen.)

Das UpdatePanel kann Zeug nicht von selbst rendern. Wie Sie bemerkt haben, laufen die Updates, aber Sie sehen das Ergebnis nicht.

Die einfachste Lösung besteht darin, einen vollständigen Postback zu erzwingen. Sie können das tun, wie folgt:

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 
} 

Auf diese Weise können immer noch die Tasten selbst von Ajax in der Update aktualisiert werden (zum Beispiel ihres Zustand gesperrt oder freigegeben ändern). Der vollständige Postback tritt nur auf, wenn auf die Schaltflächen geklickt wird.

0

Wie andere gesagt haben, ein Update-Panel aktualisiert nur seinen Inhalt, das ist einer der wichtigsten Vorteile seiner Verwendung.

Panel2 und pnlPrvCmt müssen sich in Ihrem Update-Fenster befinden, damit Ihre Tastenklick-Methode funktioniert. Eine andere Option wäre, Panel2 in ein Update-Panel und pnlPrvCmt innerhalb eines zweiten Update-Panels zu platzieren. Dann wird jedes Steuerelement innerhalb des Update-Fensters beide aktualisieren, solange der UpdateMode = Always (was standardmäßig ist).

0

Versuchen Sie, dem dynamischen Steuerelement beim Erstellen eine ID zu geben.
Aus irgendeinem Grund wird dies von .net für ein dynamisches Steuerelement benötigt, um in diesem Kontext zu arbeiten.

myControl.id="newID" 
0

Ich habe dies gefunden unter 2 verschiedenen scenerios auftreten:

  1. No ID Satz auf das Steuerelement. Entweder ist die ID des Markups nicht vorhanden oder die ID wurde nicht festgelegt, als ein dynamisches Steuerelement erstellt wurde. ASP.Net verwendet die ID zum Verfolgen von Aktionen.

  2. Verschachtelte UpdatePanels. Scenerio: Wenn Sie eine Masterpage verwenden, verfügen Sie möglicherweise über einen Inhaltsplatzhalter, den Sie in ein UpdatePanel einbinden, sodass ein UpdatePanel im Inhalt auf der Seite nicht benötigt wird. Bei der Entwicklung Ihrer Seite können Sie dann aus Gewohnheit ein UpdatePanel hinzufügen.

Verwandte Themen