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