Login
suchen
HAUPPAUGE WinTV-PVR und Media Center Edition 2005: Fernbedienung
Apr 4

Written by: Marcel Binot
04.04.2004

Viele Schwierigkeiten von Einsteigern bei der Erstellung eigener (Custom-)Controls ergeben sich aus der Unkenntnis des genauen Lebenszyklus eines solchen. Meist rühren die Probleme daher, dass bei einem PostBack der Zustand des Controls (samt seiner ChildControls) nicht 1:1 wieder hergestellt wird. Die Folge davon ist, dass beispielsweise die Event-Handler nicht mehr richtig zu den Controls zugeordnet werden können. (Dabei können erstaunliche, scheinbar mysteriöse Nebeneffekte auftreten, die, wenn sie den leidgeplagten Programmierer nicht zur Verzweiflung treiben würden, wirklich lustig wären. Beispielsweise wird statt des erwarteten, registrierten Event-Handler eines Controls auch schonmal der eines vollkommen anderen aufgerufen.)

Zu diesem Thema kann ich übrigens das Buch "ASP.NET Server Controls and Components" von Nikhil Kothari und Vandana Datye (erschienen im Microsoft-Verlag) emfpehlen. Darin ist auf Seite 175 auch der Lebenszyklus eines CustomControl abgebildet. Leider fehlen mir in dieser Darstellung eine wichtige Methode: CreateChildControls(). Daher versuche ich eine angereicherte Darstellung der Abläufe:

Ohne PostBack:

  1. Instanciate: Constructor
  2. Init() und OnInit()
  3. TrackViewState()
  4. Load() / OnLoad()
  5. ggf. DataBind() und OnDataBinding()
  6. EnsureChildControls() und CreateChildControls()
  7. PreRender() und OnPreRender()
  8. SaveViewState()
  9. Render()
  10. RenderChildren()
  11. Unload() und OnUnload()

Mit PostBack:

  1. Instanciate: Constructor
  2. Init() und OnInit()
  3. TrackViewState()
  4. HasChildControls(), EnsureChildControls() und CreateChildControls()
  5. LoadViewSate()
  6. LoadPostData()
  7. Load() / OnLoad()
  8. RaisePostDataChangedEvent()
  9. RaisePostBackEvent() 
  10. DataBind() und OnDataBinding()
  11. EnsureChildControls() und CreateChildControls()
  12. PreRender() und OnPreRender()
  13. SaveViewState()
  14. Render()
  15. RenderChildren()
  16. Unload() und OnUnload()

Man muss sich bewusst machen, dass bei einem PostBack das Control (plus ChildControls) zunächst 1:1 wieder hergestellt wird. Dies geschieht unter Punkt 4. Anschließend wird der Zustand des Controls wiederhergestellt (Punkte 5 u. 6) und erst danach werden die registrierten Handler aufgerufen (Punkte 8 u. 9)
Kann (durch unglückliche Programmierung) der Zustand der Controls nicht ordentlich wieder hergestellt werden, können auch die registrierten Handler nicht korrekt zugewiesen werden, und es kommt beim Aufruf der Handler zu einem unkalkulierbaren Durcheinander.

Tags:
 
(c) 2007 e-llusions
Terms Of Use