Die genaue Kenntnis der Reihenfolge der Ereignisse beim Laden und Öffnen bzw. Schließen und Entladen eines Forms und eines UserControls kann einiges an Kopfzerbrechen verhindern und eine große Hilfe sein. Die beteiligten Ereignisse werden nämlich immer stur in einer festgelegten Abfolge ausgelöst.
Allein schon das Verständnis der Ereignisfolge eines Forms kann Ihnen dabei helfen, den Code für verschiedene Aufgaben in das richtige, passende Ereignis zu legen. Das gleiche gilt, für sich genommen, auch für die Entwicklung von Steuerelementen auf der Basis des UserControls. Aber auch das Zusammenspiel beider Objekte und die sich daraus ergebende "durchmischte" Ereignisfolge bietet interessante Erkenntnisse über das "Leben" von Forms und Steuerelementen. Darüber hinaus legt ein UserControl die gleichen Ereignisse offen, wie sie im Prinzip auch innerhalb eines für Sie verschlossenen, bereits vorgefertigten Steuerelements abgearbeitet werden. Die Kenntnis der Ereignisse eines UserControls verhilft Ihnen damit ebenso zum Verständnis der Funktionsweise und so mancher Verhaltenseigenarten anderer Steuerelemente.
Ich habe Ihnen dazu ein kleines Beispiel-Projekt erstellt, das aus einem Form und einem UserControl besteht. Eine Instanz des UserControls ist direkt auf dem Form platziert, eine zweite Instanz auf diesem ersten UserControl (Dazu ist die Eigenschaft ControlContainer des UserControls auf True gesetzt).
Alle relevanten Ereignisse melden sich über eine Debug.Print-Ausgabe im Direktfenster, so dass Sie die Reihenfolge der Ereignisse bequem bei einem Debug-Durchlauf Schritt für Schritt im Direktfenster sehen, oder sich nach einem durchgehenden Start hinterher dort ansehen können. Damit Sie die beiden UserControl-Instanzen voneinander unterscheiden können, wird bei diesen noch der Steuerelement-Name angezeigt, den sie im Form erhalten haben (Ambient.DisplayName). Lediglich beim Initialize-Ereignis des UserControls steht der Name noch nicht zur Verfügung - die Zuordnung ist aber eindeutig zu erkennen. Damit beim Terminate-Ereignis des UserControls der Name auch noch ausgegeben werden kann, obwohl die Ambient.DisplayName-Eigenschaft dann schon nicht mehr zur Verfügung steht, wird er bereits im ReadProperties-Ereignis des UserControls in einer modulweit gültigen Variablen abgelegt.
|