2010-03-26 16 views
48

Pour les applications WinForms Je me demande quel code configuration devrait aller:Quel code d'installation doit contenir dans Constructeurs de formulaire par rapport à l'événement Form Load?

  • MainForm()

par opposition à

  • MainForm_Load (sender objet, EventArgs e)

Y a-t-il des lignes directrices sur les meilleures pratiques ici?

+2

Une troisième possibilité est l'événement affiché. J'ai trouvé que certaines choses comme "this.Activate();", "this.BringToFront();" et "this.Focus();" avoir une meilleure chance d'y travailler que dans l'événement FormLoad. – RenniePet

+1

Copie possible de [événement Winforms Form Constructeur vs Load] (http://stackoverflow.com/questions/264396/winforms-form-constructor-vs-load-event) –

+0

voir aussi https://stackoverflow.com/questions/ 3670806/form-load-event-or-override-onload – DaveInCaz

Répondre

65

Les programmeurs qui ont travaillé avec VB6 ont tendance à mettre beaucoup de code dans l'événement Load, dans VB6 cet événement a été utilisé pour initialiser le formulaire. Mais ce n'est plus approprié dans Windows Forms, la classe Form peut avoir un constructeur. La méthode .NET consiste à initialiser les objets de classe dans le constructeur, il y a très peu de raisons impérieuses de ne pas le faire pour la classe Form. L'événement Load s'exécute juste après la création du handle de fenêtre pour le formulaire, juste avant qu'il ne soit visible par l'utilisateur. Vous devez uniquement écrire du code dans le gestionnaire d'événements qui dépend de la création du handle. Il n'y a pas de charge de code qui soit qualifiée pour cette exigence sauf un type: code qui nécessite que la taille et l'emplacement de la fenêtre soient connus.

Les valeurs des propriétés Taille et Emplacement au moment du design d'un Formulaire ne sont pas les mêmes que leurs valeurs réelles lorsque le formulaire s'exécute sur une autre machine. Le formulaire peut être redimensionné pour prendre en charge la taille de la police système ou le paramètre DPI de la carte vidéo sur la machine cible. Les préférences de l'utilisateur jouent également un rôle, l'utilisateur peut avoir sélectionné une taille de police différente pour la légende de la fenêtre. Cela ne vous intéresse généralement pas, sauf si vous voulez que la fenêtre ait une position particulière sur le bureau ou soit alignée avec une autre fenêtre.

L'écriture de code dans l'événement Load, par exemple initialiser les contrôles TreeView ou ListView, peut ralentir considérablement le temps de démarrage. Lorsque vous le faites dans le constructeur, Windows Forms n'a pas encore besoin de mettre à jour la fenêtre physique, il n'a pas encore été créé. Une fois le contrôle natif créé, Winforms l'initialise avec une mise à jour groupée au lieu d'un nœud/élément à la fois, comme cela se produit lorsque le code s'exécute dans l'événement Load. Grande différence. Last but not least: vous ne devriez jamais utiliser l'événement Load, vous devez remplacer la méthode OnLoad().Cela garantit que le code s'exécute dans un ordre prévisible lorsque vous (ou quelqu'un d'autre) hérite de votre classe Form. IntelliSense vous aide à écrire cette méthode, il suffit de taper "protected onl" et d'appuyer sur tab pour que IntelliSense auto-complète la méthode. Notez comment vous avez le choix de mettre du code avant ou après l'appel de base.OnLoad(), c'est ainsi que vous contrôlez qui est le boss. Vous êtes le patron quand vous le mettez après, pas souvent le bon choix btw.

+6

Excellente information merci - mais sur le dernier point pourquoi Microsoft nous donne l'événement de charge à utiliser facilement dans VS si on devrait vraiment surcharger OnLoad de toute façon – Greg

+10

Pour encourager les programmeurs à passer à .NET il y a 8 ans, c'était le modèle de programmation familier . Surcharger OnLoad est vraiment facile aussi, IntelliSense fait 80% du travail lorsque vous commencez à taper. Mais il faut taper au lieu de cliquer. Malheureusement, "facile à utiliser" ne signifie pas toujours "correct à utiliser". –

+0

Il est bon de savoir que (contrairement à d'autres frameworks que j'ai utilisés) dans Winforms, vous pouvez initialiser des contrôles dans le constructeur. Fonctionne un régal. – Stewart

8

un coup d'œil à Use Constructor in Windows Forms to Ensure Proper Initialization

Utilisez le constructeur dans un Windows Form pour assurer que l'initialisation est fait correctement. Ordre de tir de l'événement est pas une science exacte, et vous ne pouvez pas toujours dépendent toujours de l'ordre dans lequel événements feu, indépendamment de ce que vous vu dans le passé.

....

Pour cette raison, Microsoft recommande que vous gérez le code d'initialisation dans les formes Constructor, en supposant que vous ne ont une initialisation vraiment temps comsuming qui pourrait se de temps tranché ou faire un DoEvents().

+0

@astander: pouvez-vous dire ce que ce texte signifie par "initialisation"? Par exemple, cela signifie-t-il charger les données d'une base de données pour les afficher dans les contrôles de formulaire? –

+0

Je dirais oui, et l'initialisation des contrôles, des classes etc, comme on peut le voir à partir de l'appel * InitializeComponent(); * dans les formulaires standard. Comme mentionné ici, faites attention aux initialisations longues, qui pourraient être appelées quand l'utilisateur en a besoin et en affichant un ** Please wait ** ou somehing like ... –

+4

"Pour cette raison, Microsoft vous recommande de gérer le code d'initialisation dans le constructeur de formulaires "- ce serait bien d'avoir une source pour cette recommandation. – Joe