
Ergänzende Betrachtungen zum Lebenszyklus einer Seite
Einzelne ASP.NET-Serversteuerelemente verfügen über einen eigenen Lebenszyklus, der dem Lebenszyklus der Seite ähnelt. So werden zum Beispiel das Init-Ereignis und das Load-Ereignis eines Steuerelements während der entsprechenden Seitenereignisse ausgelöst.
Obwohl Init und Load rekursiv für jedes Steuerelement ausgelöst werden, geschieht dies in umgekehrter Reihenfolge. Das Init-Ereignis wird (zusammen mit dem Unload-Ereignis) für jedes untergeordnete Steuerelement aufgerufen, bevor das zugehörige Ereignis für dessen Container ausgelöst wird (von unten nach oben). Das Load-Ereignis für einen Container wird dagegen vor den Load-Ereignissen für die zugehörigen untergeordneten Steuerelemente aufgerufen (von oben nach unten).
Darstellung und Inhalt eines Steuerelements können durch eine Behandlung der zugehörigen Ereignisse angepasst werden, wie z. B. des Click-Ereignisses beim Button-Steuerelement und des SelectedIndexChanged-Ereignisses beim ListBox-Steuerelement. Unter bestimmten Umständen kann auch das DataBinding-Ereignis oder das DataBound-Ereignis eines Steuerelements behandelt werden. Weitere Informationen finden Sie in den Themen der Klassenreferenz zu den einzelnen Steuerelementen sowie unter Entwickeln von benutzerdefinierten ASP.NET-Serversteuerelementen.
Wenn eine Klasse von der Page-Klasse geerbt wird, können Sie neben der Behandlung von Ereignissen, die von der Seite ausgelöst werden, auch Methoden aus der Basisklasse der Seite überschreiben. So können Sie zum Beispiel die InitializeCulture-Methode der Seite dahingehend überschreiben, dass Kulturinformationen dynamisch festgelegt werden. Beachten Sie, dass beim Erstellen eines Ereignishandlers unter Verwendung der Page_Ereignis-Syntax die Basisimplementierung implizit aufgerufen wird und Sie daher diese Basisimplementierung in Ihrer Methode nicht mehr aufrufen müssen. So wird zum Beispiel die OnLoad-Methode der Basisseitenklasse immer aufgerufen, unabhängig davon, ob Sie eine Page_Load-Methode erstellen oder nicht. Wenn Sie jedoch die OnLoad-Methode der Seite mit dem override-Schlüsselwort (Overrides in Visual Basic) überschreiben, müssen Sie die Basismethode explizit aufrufen. Wenn Sie zum Beispiel die OnLoad-Methode der Seite überschreiben, müssen Sie base.Load (MyBase.Load in Visual Basic) aufrufen, damit die Basisimplementierung ausgeführt wird.
Synchronisieren von Ereignissen für hinzugefügte Steuerelemente
Wenn Steuerelemente dynamisch zur Laufzeit oder deklarativ in Vorlagen datengebundener Steuerelemente erstellt werden, werden die zugehörigen Ereignisse mit denen anderer Steuerelemente der Seite zunächst nicht synchronisiert. Beispielsweise können das Init-Ereignis und das Load-Ereignis bei einem Steuerelement, das zur Laufzeit hinzugefügt wird, viel später im Lebenszyklus der Seite auftreten als die gleichen Ereignisse bei Steuerelementen, die deklarativ erstellt werden. Daher lösen dynamisch hinzugefügte Steuerelemente sowie Steuerelemente in Vorlagen die Ereignisse ab dem Zeitpunkt ihrer Instanziierung nacheinander aus, bis sie mit dem Ereignis synchronisiert sind, bei dem sie zur Controls-Auflistung hinzugefügt wurden.
Dies muss normalerweise nur beachtet werden, wenn geschachtelte datengebundene Steuerelemente vorhanden sind. Wenn ein untergeordnetes Steuerelement an Daten gebunden wurde, das zugehörige Containersteuerelement jedoch noch nicht, sind die Daten im untergeordneten Steuerelement mit den Daten im Containersteuerelement möglicherweise nicht synchronisiert. Dies kann insbesondere der Fall sein, wenn von den Daten im untergeordneten Steuerelement eine Verarbeitung auf Basis eines datengebundenen Werts im Containersteuerelement durchgeführt wird.
Dies kann beispielsweise der Fall sein, wenn von GridView in jeder Zeile ein Firmendatensatz zusammen mit einer Liste der Firmenchefs in einem ListBox-Steuerelement angezeigt wird. Um die Liste der Firmenchefs zu füllen, wird das ListBox-Steuerelement an ein Datenquellensteuerelement gebunden (wie z. B. SqlDataSource), von dem die Daten der Firmenchefs mithilfe der CompanyID in einer Abfrage abgerufen werden.
Wenn die Datenbindungseigenschaften des ListBox-Steuerelements, wie z. B. DataSourceID und DataMember, deklarativ festgelegt werden, versucht das ListBox-Steuerelement während des DataBinding-Ereignisses der zugehörigen Zeile, eine Bindung mit der zugehörigen Datenquelle einzugehen. Das Feld CompanyID der Zeile enthält jedoch keinen Wert, bis das RowDataBound-Ereignis des GridView-Steuerelements ausgelöst wird. In diesem Fall wird das untergeordnete Steuerelement (das ListBox-Steuerelement) vor dem Steuerelement gebunden, in dem es enthalten ist (das GridView-Steuerelement). Die Phasen der Datenbindung sind daher nicht synchronisiert.
Um diesen Zustand zu vermeiden, legen Sie das Datenquellensteuerelement des ListBox-Steuerelements im gleichen Vorlagenelement fest wie das ListBox-Steuerelement selbst, und legen Sie die Datenbindungseigenschaften von ListBox nicht deklarativ fest. Stattdessen legen Sie diese programmgesteuert zur Laufzeit während des RowDataBound-Ereignisses fest, sodass das ListBox-Steuerelement erst an die Daten gebunden wird, wenn die CompanyID-Informationen verfügbar sind.
Weitere Informationen finden Sie unter Binden an Daten mit einem Datenquellensteuerelement.