2010-09-08 5 views
24

J'aimerais que quelqu'un essaie d'expliquer la différence entre ceux-ci. Plus précisément, exemple de scénario d'utilisation.Form_Load() 'event' ou Override OnLoad()

Je suis refactoring du code Windows Form et un Form a un code en cas Form_Load() et aussi un événement protected override void OnLoad() qui appelle base.OnLoad(e); Maintenant, je traçais et les feux de Override d'abord, puis immédiatement se déclenche au large de la version événement.

Alors, lequel est généralement utilisé et pourquoi?

+0

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

Répondre

23

Vous devez toujours remplacer OnLoad(). L'utilisation de l'événement n'est appropriée que lorsque une autre classe serait intéressée par l'événement. Quels sont les événements pour lesquels? Une autre classe intéressée par l'événement Load est très rare, seulement très utile pour faire des arrangements de fenêtres.

Néanmoins, l'événement Load fonctionne bien avec le concepteur et les programmeurs VB6 sont très à l'aise avec celui-ci. Ce n'est pas horriblement faux, vous auriez seulement des ennuis quand vous commencerez à hériter du formulaire et que le code ne fonctionnera pas dans le bon ordre.

La plupart du code qui est maintenant placé dans l'événement Load appartient réellement au constructeur. Vous avez seulement besoin de OnLoad si:

  • Vous devez connaître la taille et la position exactes de la fenêtre. OnLoad est le meilleur, la fenêtre Handle est créée et les préférences de l'utilisateur sont appliquées (titre et taille de la bordure) et le formulaire a été mis à l'échelle comme indiqué par la propriété Form.AutoScaleMode. La fenêtre n'est pas encore visible, un très bon moment pour déplacer la fenêtre ailleurs ou pour organiser les contrôles enfants.
  • Vous avez du code qui nécessite la propriété Handle. C'est subtil, vous ne pouvez pas toujours le dire. Si le code du constructeur est malsain, la fenêtre est créée avant la fin du constructeur. Il arrive généralement à une bonne fin, mais il peut rendre la création de la forme très lente. Facile à diagnostiquer depuis la fenêtre Call Stack.
  • Pour éviter un bug dans l'implémentation de MDI. Si vous créez un enfant MDI dans le constructeur parent, vous obtiendrez des glyphes dupliqués, visibles lorsque vous agrandissez l'enfant. Créez plutôt l'enfant dans OnLoad.
+0

Alors, arrêtez-moi si je me trompe, mais il est plus «correct» d'utiliser le 'OnLoad()' mais je devrais être conscient du fait que le code là-bas ne serait pas disponible pour une autre classe. Correct? –

+0

Il est * disponible * pour une classe dérivée, base.OnLoad(). Sauter l'initialisation de la classe de base serait presque toujours faux. * Une autre classe * n'a rien à voir avec le code dans Load/OnLoad. –

+0

Donc, si une classe dérivée appelait 'OnLoad()', elle lancerait 'base.OnLoad()' et ensuite tout code que je mettrais après cela. –

0

OnLoad déclenche le Charger l'événement, géré par . Voir le . Donc, dans votre code, à la fin de votre fonction d'initialisation, vous pouvez appeler la fonction OnLoad. La classe de base appelle alors vos gestionnaires d'événements (dans ce cas), que vous avez peut-être définis dans votre code d'initialisation.

Personnellement, je placerais mon code dans le Form_Init et laisserais OnLoad pour lancer l'événement, puisque je gère l'événement, bien que vous puissiez défendre soit avec raison, comme vous le voyez dans vos réponses.

+0

je peux être dense mais je pense vous confirmez ce que j'ai dit à propos d'OnLoad en appelant Load Event mais est-ce que cela répond à ma question à propos de laquelle je devrais placer mon code? Il me semble que je peux le mettre dans l'un ou l'autre effet aussi longtemps que c'est après l'appel 'base.OnLoad (e)'. –

+2

Cette réponse ne répond pas à la question, qui n'est pas de savoir s'il faut * appeler * 'OnLoad' mais s'il faut * le remplacer *. – reinierpost

2

Lors de la substitution OnLoad, l'appel à base.OnLoad appelle l'événement Load -event du formulaire.

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

Si vous n'avez pas besoin spécifiquement pour effectuer des choses avant que la charge événement est soulevée, en plaçant le code dans OnLoadaprèsbase.OnLoad(e) donne le même comportement d'exécution en le plaçant dans le gestionnaire d'événements .

Je vous recommande de remplacer la méthode plutôt que de vous abonner à l'événement.

+0

Merci pour la réponse, mais il semble que vous dites qu'il n'y a pas de réponse définitive à ma question au-delà du calendrier de chargement du formulaire, correct? –

+1

Je remplacerais personnellement la méthode OnLoad, car c'est l'approche typique lors de la création de classes héritées. Les événements sont, comme mentionné par Hans Passant, destinés à d'autres classes qui peuvent s'y abonner. Mais en pratique, il n'y a pas de réelle différence. – bernhof