Clausola handles MyBase.Load con form ereditati

lunedì 10 novembre 2008 - 18.59

denis.basei Profilo | Senior Member

Sto lavorando in vb net con un inherits form e non ho capito una cosa: nel form base gestisco il seguente evento
Private Sub BASEfrmUnboundDataForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
'be sure to fill the lookup on load
'don't fill in designer
If Me.DesignMode = False Then FillLookup()
End Sub

Nel form ereditato gestisco di nuovo lo stesso evento

Private Sub frmLookup_AllineaPos18_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
gbHorvRule.Height = 330


'call to repopulate the form--so combo gets filled
Me.PopulateForm()
End Sub

Lavorando con il debugger vedo che vengono eseguiti entrambe gli eventi Load (form base e nel form ereditato). Perchè?


Grazie
Denis B. - www.baseiengineering.com

aiedail92 Profilo | Expert

Ciao

È giusto che l'evento venga generato per entrambi i controlli: quando erediti da una classe semplificando non fai altro che "aggiungere delle espansioni" a ciò che già esiste, ed è quindi normale che, gestendo un evento MyBase.Event, quest'evento venga gestito anche in una classe derivata, in aggiunta ad un nuovo gestore che decidi di aggiungere.

Luca

denis.basei Profilo | Senior Member

Ciao Luca e grazie per avere risposto al mio quesito.

Se non ho capito male allora se nel form base, in corrispondenza dell'evento Private Sub BASEfrmUnboundDataForm_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load anzichè scrivere "Handles MyBase.Load" avessi messo "Handles BASEfrmUnboundDataForm.Load" nel form ereditato non si sarebbe scatenato l'evento ..._load del form base?
Sempre considerando questa ipotesi nel form ereditato avrei potuto comunque usare Handles MyBase.Load?



Grazie

Denis B. - www.baseiengineering.com

aiedail92 Profilo | Expert

Scusa, forse sono io che non mi sono spiegato bene... In pratica un evento è un delegato, cioè un riferimento ad uno o più metodi. Quando generi (o viene generato) un evento, viene eseguito il codice di ogni metodo a cui l'evento (il delegato dell'evento) fa riferimento.

Se, come vuoi fare tu, non vuoi che l'evento venga scatenato, invece che gestire l'evento devi eseguire l'override del metodo OnLoad, in questo modo:

Class FormBase Inherits Form 'Esegue l'override di OnLoad: questo metodo viene chiamato quando viene generato 'l'evento Load, se esegui l'override in una classe derivata il codice della classe 'base non viene più eseguito a meno che non ne fai esplicita richiesta Protected Overrides Sub OnLoad(ByVal e As System.EventArgs) 'Esegue i compiti che devi fare sull'evento Load 'bla bla bla 'Chiama esplicitamente il codice della classe base MyBase.OnLoad(e) End Sub End Class Class FormDerivato Inherits FormBase 'Esegue l'override del metodo OnLoad: in questo modo il metodo della classe 'base non viene chiamato se non viene richiesto esplicitamente Protected Overrides Sub OnLoad(ByVal e As System.EventArgs) 'Esegue il codice esclusivo della classe End Sub End Class

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5