Dans .NET, Windows Forms a un événement qui se déclenche avant le chargement du formulaire (Form.Load), mais il n'y a aucun événement correspondant qui est déclenché APRÈS le chargement du formulaire. Je voudrais exécuter une logique après le chargement du formulaire.
Quelqu'un peut-il conseiller sur une solution?
Réponses:
Vous pouvez utiliser l'événement " Shown ": MSDN - Form.Shown
"L'événement Shown n'est déclenché que la première fois qu'un formulaire est affiché; par la suite, réduire, maximiser, restaurer, masquer, afficher ou invalider et repeindre ne déclenchera pas cet événement."
la source
Shown += Form1_Shown;
comme suggéré dans un autre filJ'utilise parfois (en charge)
ou
(remplacez "this" par votre variable de formulaire si vous gérez l'événement sur une instance autre que "this").
Cela pousse l'appel sur la boucle windows-forms, de sorte qu'il est traité lorsque le formulaire traite la file d'attente de messages.
[mis à jour sur demande]
Les méthodes Control.Invoke / Control.BeginInvoke sont destinées à être utilisées avec le threading et sont un mécanisme pour pousser le travail sur le thread d'interface utilisateur. Normalement, cela est utilisé par les threads de travail, etc. Control.Invoke effectue un appel synchrone, alors que Control.BeginInvoke effectue un appel asynchrone.
Normalement, ceux-ci seraient utilisés comme:
Il le fait en poussant un message dans la file d'attente de messages Windows; le thread de l'interface utilisateur (à un moment donné) met le message en file d'attente, traite le délégué et signale au travailleur qu'il s'est terminé ... jusqu'à présent tout va bien ;-p
D'ACCORD; alors que se passe-t-il si nous utilisons Control.Invoke / Control.BeginInvoke sur le thread d'interface utilisateur? Il fait face ... si vous appelez Control.Invoke, il est assez judicieux de savoir que le blocage de la file d'attente de messages entraînerait un blocage immédiat - donc si vous êtes déjà sur le thread de l'interface utilisateur, il exécute simplement le code immédiatement ... de sorte que ne nous aide pas ...
Mais Control.BeginInvoke fonctionne différemment: il pousse toujours le travail dans la file d'attente, même si nous sommes déjà sur le thread de l'interface utilisateur. Cela fait une façon vraiment simple de dire "dans un instant", mais sans les inconvénients des minuteries, etc. (qui devraient quand même faire la même chose de toute façon!).
la source
La première fois qu'il ne démarrera PAS "AfterLoading",
il l'enregistrera simplement pour démarrer le chargement suivant.
la source
J'ai eu le même problème et je l'ai résolu comme suit:
En fait, je veux afficher le message et le fermer automatiquement après 2 secondes. Pour cela, j'ai dû générer un formulaire simple (dynamiquement) et une étiquette affichant le message, arrêter le message pendant 1500 ms pour que l'utilisateur le lise. Et fermez le formulaire créé dynamiquement. L'événement affiché se produit après l'événement de chargement. Donc, le code est
la source
Vous pouvez également essayer de placer votre code dans l'événement Activated du formulaire, si vous souhaitez qu'il se produise, juste lorsque le formulaire est activé. Vous auriez besoin de mettre une vérification booléenne «a exécuté» si elle n'est censée s'exécuter qu'à la première activation.
la source
C'est une vieille question et dépend davantage du moment où vous devez commencer vos routines. Puisque personne ne veut d'exception de référence nulle, il est toujours préférable de vérifier d'abord la valeur null, puis de l'utiliser au besoin; cela seul peut vous épargner beaucoup de chagrin.
La raison la plus courante de ce type de question est lorsqu'un conteneur ou un type de contrôle personnalisé tente d'accéder à des propriétés initialisées en dehors d'une classe personnalisée où ces propriétés n'ont pas encore été initialisées, ce qui peut entraîner le remplissage de valeurs nulles et peut même provoquer des exceptions de référence nulles sur les types d'objets. Cela signifie que votre classe est en cours d'exécution avant d'être complètement initialisée - avant que vous ayez fini de définir vos propriétés, etc. Une autre raison possible pour ce type de question est de savoir quand effectuer des graphiques personnalisés.
Pour mieux répondre à la question de savoir quand commencer à exécuter le code après l'événement de chargement de formulaire, il faut surveiller le message WM_Paint ou se connecter directement à l'événement de peinture lui-même. Pourquoi? L'événement paint se déclenche uniquement lorsque tous les modules sont complètement chargés par rapport à votre événement de chargement de formulaire. Remarque: This.visible == true n'est pas toujours vrai lorsqu'il est défini sur true, il n'est donc pas du tout utilisé à cette fin, sauf pour masquer un formulaire.
Voici un exemple complet de la façon de commencer à exécuter votre code après l'événement de chargement de formulaire. Il est recommandé de ne pas lier inutilement la boucle du message de peinture afin que nous créions un événement qui commencera à exécuter votre code en dehors de cette boucle.
namespace MyProgramStartingPlaceExample {
}
la source
Je sais que c'est un ancien message. Mais voici comment je l'ai fait:
la source
Vous pouvez fermer votre formulaire après une certaine exécution.
//YourForm.ActiveForm.Close ();
la source