IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Exécution de code après Affichage d'une Form en mode modal


Sujet :

C#

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 34
    Points : 12
    Points
    12
    Par défaut Exécution de code après Affichage d'une Form en mode modal
    Bonjour,

    J'ai une form que j'exécute en mode modal "form.ShowDialog()".

    Je voudrais exécuter un code lorsque la form est entièrement affichée, mais je n'y arrive pas.

    J'ai essayé l'événement Shown() et d'autres évènement de la form, mais elle ne s'affiche pas entièrement avant de déclencher l'exécution de mon code !

    Avez-vous des idées, merci?

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    C'est pourtant bien l'événement Shown qui semble le plus adapté à ce que tu recherches, puisqu'il est bien déclenché après l'affichage du formulaire.

    Tu peux retrouver l'ensemble des événements généré durant l'ouverture et la fermeture d'une form sur la MSDN

    En quoi dis-tu que l'affichage n'est pas complet ? Est-ce parce que tu as des contrôles à l'intérieur qui n'ont pas fini leur initialisation (par exemple, un datagridview) ? De même, si tu nous fournis ton code on sera plus à même de t'aider.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 34
    Points : 12
    Points
    12
    Par défaut
    En effet, les controls contenu dans la form ne s'affice pas complètement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    using System;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                Form2 f = new Form2();
                f.ShowDialog();
            }
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    using System;
    using System.Windows.Forms;
     
    namespace WindowsFormsApplication1
    {
        public partial class Form2 : Form
        {
            public Form2()
            {
                InitializeComponent();
            }
     
            private void Form2_Shown(object sender, EventArgs e)
            {
                CodeAExecuter();
            }
     
            private void CodeAExecuter()
            {
                System.Threading.Thread.Sleep(5000);
            }
        }
    }
    Comment exécuter la méthode CodeAExecuter() lorsque l'affichage de form2 est complet?

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par rubisvert Voir le message
    En effet, les controls contenu dans la form ne s'affice pas complètement.
    C'est la qu'il nous faudrait plus d'informations. Quels sont les contrôles présents ? Quel soucis apparaît si la méthode est exécutée "trop tôt" ?
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 34
    Points : 12
    Points
    12
    Par défaut
    Il y a 2 label sur la form2 et un bouton. J'ai tout précisé.

  6. #6
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Quel soucis apparaît si la méthode est exécutée "trop tôt" ?
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  7. #7
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 34
    Points : 12
    Points
    12
    Par défaut
    Le projet complet ci-joint.
    Fichiers attachés Fichiers attachés

  8. #8
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Héhé, c'est bien ce que je pressentais ! Le problème n'a rien à voir avec une exécution qui serait faite avant affichage.

    Pour bien comprendre, il faut savoir que les Windows Form utilisent une boucle d'événements pour gérer le cycle de vie des différents éléments (la form, les contrôles, etc...). Dès qu'un événement survient (un clic, un déplacement de la souris, le besoin de redessiner un contrôle, etc...), cet événement est placé dans une file d'attente qui est traitée en FIFO (First In First Out) par la boucle d'événements.

    Ici, tu fais exactement ce qu'il ne faut surtout pas faire : avoir un traitement long au sein de ta boucle d'événements. Pourquoi ? Parce que la boucle d'événements ne peut traiter qu'un seul événement à la fois. Si un traitement dure 10s, alors ta boucle d'événements est bloquée pendant 10s. Les événements s'accumulent sans pouvoir être traités. Et c'est exactement ce qui se passe ici. Ton System.Threading.Thread.Sleep(5000); met en pause ta boucle d'événements pendant 5s, gelant ainsi toutes les interfaces graphiques de ton programme pendant ce même laps de temps.

    Si tu as un traitement long, il est recommandé d'utiliser un BackgroundWorker, ou des tâches (ThreadPool, Task (dispo depuis .Net4), async/await dispo depuis .Net4.5). Comme tu le vois, le choix est large.

    En prime, le code pour la version async/await :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private async void CodeAExecuter()
    {
       await Task.Delay(5000);
    }
    Il suffit de remplacer ta méthode CodeAExecuter initiale par celle-ci pour bénéficier de la puissance de async/await.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 34
    Points : 12
    Points
    12
    Par défaut
    Merci pour la piste, j'ai finalement voulu utiliser Task, mais je suis confronter à un autre problème,
    car je souhaite modifier le text de label1 dans CodeAexecuter, et j'ai une erreur comme quoi label1 a été crée dans un autre thread et ça plante...
    Fichiers attachés Fichiers attachés

  10. #10
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Et cette erreur est tout à fait normal.

    Pour modifier de manière sûre un contrôle depuis un autre thread, il faut utiliser la méthode Invoke sur ce contrôle.

    A noter que l'approche avec async/await ne nécessite pas cela (c'est une des raisons qui a mené à l'insertion de cette notion).
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  11. #11
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 34
    Points : 12
    Points
    12
    Par défaut
    Et comment utiliser async/await , si la méthode CodeAexecuter est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                label1.Text = "Début code";
                System.Threading.Thread.Sleep(5000);
                label1.Text = "Fin code";
    ?

  12. #12
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private async void CodeAExecuter()
    {
       label1.Text = "Début code";
       await Task.Delay(5000);
       label1.Text = "Fin code";
    }
    C'est aussi simple que cela. Il faut juste remplacer l'appel à System.Threading.Thread.Sleep par Task.Delay, car le premier ne supporte pas async/away, contrairement au second.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  13. #13
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 34
    Points : 12
    Points
    12
    Par défaut
    Ca fonctionne, merci.
    Mais en réalité, le délai de 5s n'existe pas et simule un traitement long.
    Donc si la méthode CodeaExecuter est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private async void CodeAExecuter()
    {
      label1.Text = "Début code";
      // Traitement long...
      label1.Text = "Fin code";
    }
    une alerte apparaît sous la méthode car elle attend un await quelque part, donc comment introduire un await dans la méthode ?

  14. #14
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Tu peux faire quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    private async void CodeAExecuter()
    {
       label1.Text = "Début code";
       await Task.Run(() => TraitementLong());
       label1.Text = "Fin code";
    }
     
    private void TraitementLong()
    {
       // Le code de ton traitement
    }
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  15. #15
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 34
    Points : 12
    Points
    12
    Par défaut
    Cette solution marche, mais elle ne permet pas de modifier les controls dans la méthode TraitementLong, ce qui peut être nécessaire dans le cas de modifications de l'affichage de form2.
    Merci tout de même pour ce début de solution.
    Fichiers attachés Fichiers attachés

  16. #16
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Dans ce cas, il faut que tu utilises la méthode Invoke pour effectuer tes appels sur tes contrôles. Je t'ai donné un lien plus haut sur comment l'utiliser.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  17. #17
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2016
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2016
    Messages : 34
    Points : 12
    Points
    12
    Par défaut
    Finalement la solution précédente me convient mieux, j'ai réduit le délai à 1ms, comme ça je peux modifier l'UI pendant le prétraitement.
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. stoppez boucle apres affichage d'une form
    Par lovedesitaliens dans le forum C#
    Réponses: 1
    Dernier message: 09/08/2010, 11h33
  2. Comment lancer une procédure après affichage d'une form
    Par Fouinard dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 29/10/2008, 09h52
  3. Problème d'affichage d'une form en mode [Design]
    Par helico2 dans le forum C++/CLI
    Réponses: 0
    Dernier message: 17/04/2008, 10h37
  4. Problème d'affichage d'une form en mode [Design]
    Par helico2 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 16/04/2008, 13h23
  5. Evénement après l'affichage d'une Form
    Par nikhil dans le forum Composants VCL
    Réponses: 2
    Dernier message: 20/06/2005, 13h57

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo