2010-09-08 31 views
24

Vorrei che qualcuno provasse e spiegasse la differenza tra questi. Più in particolare, esempi di scenari di utilizzo.Form_Load() 'evento' o Sovrascrivi OnLoad()

sto refactoring alcuni Windows Form codice e Form ha qualche codice nell'evento Form_Load() e anche in un evento protected override void OnLoad() che chiama base.OnLoad(e); Ora ho tracciato e gli incendi Override prima e subito dopo spara la versione degli eventi.

Quindi, quale viene in genere utilizzato e perché?

+0

vedi anche https://stackoverflow.com/questions/2521322/what-setup-code-should-go-in-form-constructors-versus-form-load-event – DaveInCaz

risposta

23

È sempre necessario eseguire l'override di OnLoad(). L'utilizzo dell'evento è appropriato solo quando la classe è interessata all'evento. Qual è lo scopo degli eventi. Un'altra classe interessata all'evento Load è molto rara, ma è davvero utile solo per organizzare le finestre.

Ancora, l'evento di caricamento funziona bene con il progettista e i programmatori VB6 sono molto confortevoli con esso. Non è terribilmente sbagliato, ti metterei nei guai solo quando inizi a ereditare il modulo e il codice non viene eseguito nell'ordine corretto.

La maggior parte del codice che ora viene inserito nell'evento Load appartiene davvero al costruttore. Hai solo bisogno di OnLoad se:

  • È necessario conoscere la dimensione e la posizione esatte della finestra. OnLoad è il migliore, viene creata la maniglia della finestra e vengono applicate le preferenze dell'utente (titolo e dimensione del bordo) e il modulo è stato ridimensionato come indicato dalla proprietà Form.AutoScaleMode. La finestra non è ancora visibile, un ottimo momento per spostare la finestra da qualche altra parte o per organizzare i controlli figlio.
  • Hai codice che richiede la proprietà Handle. Questo è sottile, non puoi sempre dirlo. Avere un codice del genere nel costruttore non è sano, la finestra viene creata prima del completamento del costruttore. Di solito si tratta di una buona fine, ma può rendere la creazione della forma molto lenta. Facile da diagnosticare dalla finestra Stack di chiamate.
  • Per evitare un bug nell'implementazione di MDI. Se crei un figlio MDI nel costruttore genitore, otterrai glifi duplicati, visibili quando massimizzi il bambino. Crea invece il figlio in OnLoad.
+0

Quindi, fermami se ho torto, ma è più "corretto" usare "OnLoad()", ma dovrei essere consapevole del fatto che il codice in là non sarebbe disponibile per un'altra classe. Corretta? –

+0

È * disponibile * per una classe derivata, base.OnLoad(). Saltare l'inizializzazione della classe base sarebbe quasi sempre sbagliato. * Un'altra classe * non ha business con il codice in Load/OnLoad. –

+0

Quindi, se una classe derivata chiama 'OnLoad()', sparerà 'base.OnLoad()' e poi ogni codice che inserisco dopo. –

0

OnLoad solleva l'evento Load, che gestisce . Vedi lo .

Quindi, nel codice, alla fine della funzione di inizializzazione, è possibile chiamare la funzione OnLoad. La classe base chiamerà quindi i gestori di eventi (in questo caso), che potresti aver impostato nel codice di inizializzazione.

Personalmente, vorrei inserire il mio codice nel Form_Init e lasciare OnLoad per iniziare l'evento, dal momento che sto gestendo l'evento, anche se puoi difenderlo con una buona ragione, come puoi vedere dalle tue risposte.

+0

io possa essere denso ma penso stai confermando quello che ho detto su OnLoad chiamando Load Event, ma questo risponde alla mia domanda su quale posizionare il mio codice? A mio parere, mi sembra di poterlo inserire con uguale effetto fintanto che è dopo la chiamata 'base.OnLoad (e)'. –

+2

Questa risposta non affronta la domanda, che non è sul fatto di * chiamare * 'OnLoad' ma sul fatto di * sovrascriverlo *. – reinierpost

2

Quando si ignora OnLoad, la chiamata a base.OnLoad richiama il Load - evento del modulo.

protected override void OnLoad(EventArgs e) 
{ 
    // do stuff before Load-event is raised 
    base.OnLoad(e); 
    // do stuff after Load-event was raised 
} 

Se non specificamente necessario eseguire roba prima che il carico-evento viene generato, mettendo il codice in OnLoaddopobase.OnLoad(e) dà lo stesso comportamento runtime come collocandolo nel gestore eventi.

Suggerirei di sovrascrivere il metodo piuttosto che sottoscrivere l'evento.

+0

Grazie per la risposta, ma sembra che tu stia dicendo che non c'è una risposta definitiva alla mia domanda oltre la tempistica del caricamento del modulo, corretto? –

+1

Ignorerei personalmente il metodo OnLoad, poiché questo è l'approccio tipico durante la creazione di classi ereditate. Gli eventi sono, come detto da Hans Passant, destinati ad altre classi che possono iscriversi a questi. Ma in pratica non c'è una vera differenza. – bernhof