2008-09-03 37 views
0

Wenn ich eine Seite zum ersten Mal lade (! IsPostback), erstelle ich eine Schaltfläche im Code und füge sie zu meiner Seite hinzu und füge dann einen Ereignishandler zum click -Ereignis hinzu.Kann mein Ereignis nicht auslösen

Wenn ich jedoch auf die Schaltfläche klicke, wird der Ereignishandler nach dem Neuladen der Seite nicht ausgelöst.

Kann jemand erklären warum?

Antwort

4

@Brad Feuer: Ihre Antwort nicht abgeschlossen ist; Er macht es höchstwahrscheinlich zu spät im Seitenlebenszyklus während des Page_Load-Ereignisses.

Okay, hier ist, was Sie vermissen.

ASP.NET ist zustandslos. Das bedeutet, nachdem Ihre Seite gerendert und an den Browser gesendet wurde, wird das Seitenobjekt und alles darauf zerstört. Es gibt keinen Link, der auf dem Server zwischen dieser Seite und dem des Browsers des Benutzers verbleibt.

Wenn der Benutzer auf eine Schaltfläche klickt, wird dieses Ereignis zusammen mit anderen Informationen, wie z. B. dem Feld verborgenes Anzeigestatus, an den Server gesendet.

Auf der Serverseite bestimmt ASP.NET, welche Seite die Anforderung verarbeitet, und erstellt die Seite von Grund auf neu. Neue Instanzen von Serversteuerelementen werden entsprechend der ASPX-Seite erstellt und verknüpft. Nach dem Zusammenbau werden die Postback-Daten ausgewertet. Der Viewstatus wird verwendet, um Steuerelemente zu füllen, und Ereignisse werden ausgelöst.

Dies alles geschieht in einer bestimmten Reihenfolge, genannt . Um komplexere Dinge in ASP.NET zu erledigen, z. B. das Erstellen dynamischer Steuerelemente und das Hinzufügen dieser Elemente zur Webseite zur Laufzeit, MÜSSEN Sie den Seitenlebenszyklus verstehen.

Mit Ihrem Problem müssen Sie diese Schaltfläche jedes Mal erstellen, wenn die Seite geladen wird. Darüber hinaus müssen Sie diese Schaltfläche erstellen, BEVOR Ereignisse auf der Seite ausgelöst werden. Kontrollereignisse werden zwischen Page_Load und Page_LoadComplete ausgelöst.

Sie möchten, dass Ihre Steuerelemente geladen werden, bevor ViewState-Informationen analysiert und zu Steuerelementen hinzugefügt werden und bevor Steuerereignisse ausgelöst werden. Daher müssen Sie das PreInit-Ereignis behandeln und an dieser Stelle die Schaltfläche hinzufügen. Auch das müssen Sie JEDES Mal tun, wenn die Seite geladen wird.

Eine letzte Anmerkung; Die Verarbeitung von Seitenereignissen ist in ASP.NET etwas seltsam, da die Ereignisse automatisch hochgefahren werden. Beachten Sie, dass der Load-Ereignishandler als Page_Load ...

bezeichnet wird
2

Sie müssen die Schaltfläche immer nur für Nicht-Postbacks hinzufügen.

0

Das ist, weil die Ereignisbindung, die geschieht, in HTML übersetzt werden muss. Dieses Postback passiert, wenn es an die Seite zwischen OnInit und OnLoad gebunden ist. Wenn Sie möchten, dass die Schaltfläche Ereignisse korrekt verknüpft, stellen Sie sicher, dass Sie die Arbeit in OnInit ausführen.

Siehe die Erklärung des Seitenlebenszyklus.

http://msdn.microsoft.com/en-us/library/ms178472.aspx

1

Wenn Sie nicht die Event-Handler auf jedem Postback wieder anbringen, dann wird das Ereignis nicht für die Schaltfläche existiert. Sie müssen sicherstellen, dass der Ereignishandler bei jeder Aktualisierung der Seite angehängt wird. So, hier ist die Reihenfolge der Ereignisse für Ihre Seite:

  1. Seite mit Knopf und Ereignis erstellt wird Prozedur zugewiesen ist
  2. Schaltfläche geklickt wird, was zu einer Postbacks
  3. Auf Postbacks, überspringt das page_load Ereignis das Anbringen ! die Event-Handler becaue Ihre Aussage IsPostBack
  4. an diesem Punkt gibt es keine Event-Handler für die Schaltfläche zu klicken, so wird es nicht Ihre Veranstaltung
Verwandte Themen