Ho creato un semplice script per capire quale è l'ordine degli eventi al caricamento di un controllo. Questo è il codice:
codice:
Imports System
Imports System.Web.UI
Imports System.Web.UI.WebControls

namespace MyControls

    Public Class MyLogIn
      Inherits Control
      Implements INamingContainer

      dim i as integer = 1
      dim cnz as boolean = true

      Protected Overrides Sub OnLoad( e As EventArgs )
        context.response.write("LoadPage (" & i &")
")
        i += 1
      end sub

      Sub CheckPassword (s as object, e as eventargs)
       cnz = false
       context.response.write("LoadCheckPassword(" & i &")
")
       i += 1
      End Sub

      Sub OutPassword (s as object, e as eventargs)
       cnz = true
       context.response.write("LoadOutPassword(" & i &")
")
       i += 1
      End Sub

      Protected Overrides Sub OnPreRender( e As EventArgs )
       context.response.write("LoadPreRender(" & i &")
")
       i += 1
       CreateChildControls()
      end sub

      Protected Overrides Sub CreateChildControls()
       context.response.write("LoadChildControl(" & i &")
")
       i += 1

       Me.controls.clear
       Dim LogInButton As New Button
       LogInButton.id="LogIn_Button"
         if cnz = true then
           LogInButton.text="LogIn"
           AddHandler LogInButton.Click, AddressOf CheckPassword
         else
           LogInButton.text="LogOut"
           AddHandler LogInButton.Click, AddressOf OutPassword
         end if
       Me.Controls.Add( LogInButton )
      End Sub




    End Class
 end namespace
Il risultato al caricamento del controllo è:

LoadPage (1)
LoadChildControl(2)
LoadPreRender(3)
LoadChildControl(4)

Il childcontrol viene caricato due volte perchè lo richiamo dalla sub OnPreRender. In questa maniera posso fare in modo che venga visualizzato un pulsante piuttosto che un altro a seconda della variabile che passo alla pressione del tasto.
Premendo il tasto di login il risultato diventa:

LoadChildControl(1)
LoadPage (2)
LoadCheckPassword(3)
LoadPreRender(4)
LoadChildControl(5)

ed il pulsante diventa correttamente quello di LogOut. Ora premendo il pulsante di LogOut mi aspetterei di ottenere:

LoadChildControl(1)
LoadPage (2)
LoadOutPassword(3)
LoadPreRender(4)
LoadChildControl(5)

ed invece non accade assolutamente nulla. E' come se la sub OutPassword associata all'envento OnClick del pulsante non venisse richiamata.

Come mai?

Ciao