Comment puis-je exécuter du code après le début de mon formulaire?

Je suis vraiment nouveau dans la programmation Windows Forms et je ne sais pas trop quelle est la bonne façon de faire de la programmation.

Ceci est ma confusion.

J’ai un seul formulaire:

public partial class ReconcilerConsoleWindow : Form { public ReconcilerConsoleWindow() { InitializeComponent(); SetLogText("Started"); } public void SetLogText(Ssortingng text) { ssortingng logInfo = DateTime.Now.TimeOfDay.ToSsortingng() + ": " + text + Environment.NewLine; tbx_Log.AppendText(logInfo); } } 

Et dans ma classe Program.cs, j’ai le code suivant:

  static class Program { ///  /// The main entry point for the application. ///  [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); ReconcilerConsoleWindow window = new ReconcilerConsoleWindow(); Application.Run(window); if (CallSomeMethod() == true) { window.SetLogText("True"); } } } 

Désormais, une fois la fenêtre affichée par la commande Application.Run, le programme s’arrête à ce stade. Comment puis-je poursuivre le traitement pendant que la fenêtre est ouverte?

Ce qui précède n’est qu’un exemple. Mon but est de lire un fichier XMl et d’afficher une datagridview. Par la suite, je surveille les modifications apscopes au fichier XMl et, chaque fois qu’une modification est apscope, je souhaite actualiser le datagridview. Cependant, une fois la console affichée, comment puis-je poursuivre mon programme et apporter des modifications aux informations affichées sur le formulaire à la volée?

Le traitement qui a lieu après Application.Run est généralement déclenché dans le gestionnaire d’événements Load du formulaire. Vous pouvez facilement créer une méthode de Load dans Visual Studio en double-cliquant sur un espace vide du formulaire.

Cela ressemblerait à quelque chose comme ça.

  private void ReconcilerConsoleWindow_Load(object sender, EventArgs e) { if (CallSomeMethod()) { this.SetLogText("True"); } } 

La raison en est (comme indiqué dans plusieurs autres réponses) parce que le thread principal (celui qui a appelé Application.Run(window) ) est maintenant utilisé pour l’utilisation de Message Pump pour le formulaire. Vous pouvez continuer à exécuter des tâches sur ce fil via la messagerie en utilisant les événements du ou des formulaires. Ou vous pouvez commencer un nouveau sujet. Cela peut être fait dans la méthode principale, avant d’appeler Application.Run(window) , mais la plupart des gens le font dans Form_Load ou le constructeur du formulaire, pour s’assurer que le formulaire est configuré, etc. Une fois Application.Run renvoyé, tous les formulaires sont maintenant fermés.

Application.Run lance la boucle de gestion des événements Windows. Cette boucle ne s’achèvera pas jusqu’à la fermeture de votre formulaire. À ce moment, tout ce que vous ferez n’aura plus d’importance.

Si vous voulez faire quelque chose avec votre formulaire, faites-le dans le gestionnaire d’événements Load du formulaire.

Program.cs n’est pas censé avoir de règles de gestion, il doit uniquement appeler votre formulaire et l’afficher. Tous les chargement / rafraîchissement / édition de la grid de données doivent être effectués dans vos formulaires. Vous devriez utiliser les événements définis sur la classe Forms, tels que: OnLoad, OnUnload, OnClose et bien d’autres, etc.

Vous manquez le concept. Dans une application Windows Forms, votre thread principal est responsable de l’exécution du formulaire.

Vous pouvez toujours utiliser plus de threads, mais dans Windows Forms, je vous recommanderais d’utiliser un composant BackgroundWorker pour les tâches parallèles: http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

Ou un minuteur: http://msdn.microsoft.com/en-us/library/system.windows.forms.timer.aspx

Une fois Application.Run (window) appelé, vous souhaiterez gérer les éléments suivants dans la fenêtre même de l’application.

Dans la vue de code du formulaire, recherchez ce qui suit (ou ajoutez-le)

 private void ReconcilerConsoleWindow_Load(object sender, EventArgs e) { //this is where you do things :) if (CallSomeMethod() == true) { window.SetLogText("True"); } }