Dans une WinForm (VS 2022): problème sur les évènements

Résolu
molo2003 Messages postés 50 Date d'inscription mardi 9 janvier 2007 Statut Membre Dernière intervention 9 juin 2023 - Modifié le 30 mai 2023 à 10:00
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 1 juin 2023 à 12:26

    Bonjour

 Un problème basique sur les évènements dans un programme WindForm en Visual Studio 2022 Entreprise

    J'avais délaissé le dev en C#; Aidez moi

    mon code:

        //  première classe

  

public partial class Form2 : Form
    {

          public EventHandler event_momo;     //  déclaration de l'évènement
                                                                //  déjà ici, dans debogage,  "event_momo = null"  mais de type EventHandler  ????


        ....

         //  plus loin, dans  la méthode qui va déclencher l'évènement


          

 EventHandler     eh    =     event_momo;

                        if ( eh != null )

               {    eh.Invoke(this, EventArgs.Empty);  }
        ....
    }


 //  seconde classe

   public partial class Form1 : Form
    {
                   
        //   pour abonner une méthode à l'évènement

            Form2  f2  =  new Form2();

                f2.event_momo += Maj_fichier;
        ....

    }


........

               
            Évidemment, je suis ici parce qu'aucun évènement n'est déclenché.
            Je n'arrive pas à voir mon erreur.

       Dans le debogage de l'appli ,  je trouve toujours "event_momo" de type "EventHandler" mais de valeur toujours "= null" ( donc idem pour "eh").
        Lors de l'exécution de l'appli, le compilateur est sous silence  ... mais aucun évènement n'est lancé.
            Pourquoi ????   Merci de votre aide.

  Dans cette appli plutôt simple, tous les évènements  liés à des contrôles (genre click sur bouton ...) fonctionnent à merveille ....

                Molo

13 réponses

Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
1 juin 2023 à 12:26

En tant que contributeur, je n'ai pas exactement la même présentation que toi.

Du coup, pas certain de t'indiquer correctement 

En bas du premier message, j'ai le bouton résolu, sinon dans les 3 points à droite, ou encore dans la roue crantée en haut


1
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
30 mai 2023 à 07:23

Bonjour 

dans ce view source, Bidou montre comment utiliser les événements 

https://codes-sources.commentcamarche.net/source/26735-passage-de-parametres


0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
30 mai 2023 à 07:25

PS: pour tes prochains posts, merci d'utiliser la coloration syntaxique comme.décrit là https://codes-sources.commentcamarche.net/faq/11288-poster-un-extrait-de-code

0
molo2003 Messages postés 50 Date d'inscription mardi 9 janvier 2007 Statut Membre Dernière intervention 9 juin 2023
30 mai 2023 à 08:01

  Bonjour  et merci Whismeril;

je connais la mécanique de passages de param d'une WinForm à une autre ....

Le lien que tu envoie est bien construit et exemplaire.

C'est ce que j'applique  ....  à part que moi je déclare le délégué dans le NameSpace  et non dans une Classe.

Est ce important ? Je ne sais pas !!!!

Par contre , la déclaration des évènements se fait toujours dans la Classe.

C'est beau mais ca ne résout pas mon problème.

Relis mon post et trouve mon erreur  ...

  Merci de ta réponse

0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
30 mai 2023 à 08:17

Ici

public EventHandler event_momo;     //  déclaration de l'évènement

Contrairement à ce que dit ton commentaire tu ne déclares pas un événement mais un objet de type EventHandler.

Un événement est de type event avec délégué

public event EventHandler event_momo;     //  déclaration de l'évènement


Plus bas, eh ne sert à rien, tu peux écrire comme ça 

event_momo?.Invoke(this, EventArgs.Empty)


 


0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
30 mai 2023 à 08:22

Par contre EventHandler est un délégué par défaut, si tu l'as overridé ça peut peut-être aussi générer un conflit.

Je n'ai jamais essayé, dans le doute.

Perso, je préfère toujours écrire mes propres délégués avec les arguments dont j'ai besoin.

0
molo2003 Messages postés 50 Date d'inscription mardi 9 janvier 2007 Statut Membre Dernière intervention 9 juin 2023
31 mai 2023 à 12:12

Bonjour Whismeril  et encore merci pour ta disponibilité.

Je vais faire un effort :utiliser votre outil "Extrait de code" :

j'ai déclaré un "delegate" perso  ... je déclare un évènement rattaché à ce "delegate" ....  etc

Voici le code ci dessous. j'espère avoir réussi

Molo  A plus

public delegate void Th_AddEventHandler(object sender, EventArgs e);     // type delegate

    public partial class Form2 : Form

    {
                    
              public event Th_AddEventHandler event_momo;   // evènement

     // .......



      // pour activer l'évènement
             Th_AddEventHandler  eh = event_momo;    // oui facultatif comme tu dis
                        
                        eh?.Invoke(this, EventArgs.Empty);
       //  ....
     }   //  fin de la première classe


  // Dans seconde classe:
 public partial class Thunder_Add : Form
     {

       //  ...

      Form2 Form_nv_adh = new Form2();                  
                             
          Form_nv_adh.event_momo += this.Evenement_Maj_fich; 
      //  ...

    }  // fin de la seconde classe 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
31 mai 2023 à 12:19

A première vue, ça me parait correct.

Par contre, comme tu n'as pas besoin de passer d'arguments, tu peux écrire le délégué sans.

A toi de voir.


0
molo2003 Messages postés 50 Date d'inscription mardi 9 janvier 2007 Statut Membre Dernière intervention 9 juin 2023
31 mai 2023 à 12:36

Merci Whismeril  ... mais hélas le code est correct  mais ca ne marche pas !!!!!

Ma préoccupation: pourquoi en debogage, je trouve toujours "event_momo  = null"  ????

Je devrais voir une valeur puisque le code est correct ... laquelle  ? je ne sais pas ....   par contre le type de "event_momo" est bien celui déclaré.

   A partir de là, je ne sais dans quelle direction chercher ???? je ne trouve pas de faille

Quels sont les outils de VS qui pourrait m'éclairer ???  m'orienter vers une recherche précise   ????

   Molo  merci

0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
31 mai 2023 à 16:36

Tu codes avec quelle framework?

Je vais tester de mon côté avec la même configuration.


0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
31 mai 2023 à 17:40

Je viens de tester en 6.0, voici les codes complets de mes 2 formulaires

namespace Test_Winform_Dot_Net_6
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Form2 monForm2 = new Form2();
            monForm2.MonEvenement += MonForm2_MonEvenement;
            monForm2.MonEventHandler += MonForm2_MonEventHandler;
            monForm2.Show();
        }

        private void MonForm2_MonEventHandler(object? sender, EventArgs e)
        {
            MessageBox.Show($"{sender?.ToString()} a généré l'évènement MonEventHandle");
        }

        private void MonForm2_MonEvenement(Form2 sender)
        {
            MessageBox.Show($"{sender?.ToString()} a généré l'évènement MonEvenement");
        }
    }
}

et

namespace Test_Winform_Dot_Net_6
{
    public partial class Form2 : Form
    {
        public delegate void MonDelegueEvenement(Form2 sender);

        public event MonDelegueEvenement MonEvenement;

        public event EventHandler MonEventHandler;

        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            MonEvenement?.Invoke(this);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            MonEventHandler?.Invoke(this, EventArgs.Empty);
        }
    }
}

J'ai donc 2 boutons, 1 évènement avec délégué perso (sans argument complémentaire, c'est un peu l'intérêt) et 1 évènement par défaut.

Et ça donne

Donc en première intention, je te propose de nettoyer ton projet, puis de le régénérer (dans le menu Générer).

Si ça ne marche pas non plus, alors cela doit venir d'une partie du code que tu ne montres pas. Un truc à la con, comme un problème de portée par exemple.


0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
31 mai 2023 à 17:42

PS vu la signature de ton EventHandler, je suppose maintenant que tu es en 4.8.

0
molo2003 Messages postés 50 Date d'inscription mardi 9 janvier 2007 Statut Membre Dernière intervention 9 juin 2023
31 mai 2023 à 19:36

bonsoir,

  je suis en NET framework 4.7.2  et avec VS 2022 Enterprise (64 bits) ...  depuis 3 mois seulement, avant c'était avec Community  (pas grand changement)

j'essaie de faire un applicatif pour enregistrer nos nouveaux adhérents de notre petite asso (300  max)  donc mon développement ne demande pas une expertise en VS.

Oui je regènère souvent la solution  .... peu  souvent je la nettoie. Le menu "Exécuter l'analyse du code sur la solution "  ca fait quoi ??? je pourrais voir ...

Mais c'est la première fois que je n'arrive pas au resultat. Le fait que "Event_momo" soir null au départ  ??? je vois cela au débogage ... donc normal que l'évènement échoue. Tu as quelle valeur quand ca marche  ???

  Je vais voir ce que je peux faire de ton code ... le monter sur un projet à part

Bonne soirée merci

0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
31 mai 2023 à 23:17

 Le fait que "Event_momo" soir null au départ  ???

Ça dépend de ce que tu appelles "au départ", dans le constructeur, c'est normal, cette méthode est exécutée au moment d'un new Form2(); et donc à cet instant, y'a encore rien d'abonné.

Plus tard (genre au moment de généré l'évènement), c'est la ou les méthode(s) abonnée(s).

L'analyse, c'est pour faire de l'optimisation.

Pour une asso, il n'y avait pas de besoin légal d'acheter la version Entreprise, Community est utilisable dans ce cas.

Les différences sont surtout dans les outils d'intégration en équipe pour les gros projets, et certains outils de debug un peu plus efficaces.


0

 Whismeril  j'ai trouvé mon erreur grâce à toi donc  grand MERCI;

Je te donne ma démarche:

A partir du code que tu m'as donné, je l'ai copié dans un nouveau projet ... et j'ai constaté que ca marchait "au poil". ... j'ai observé ton code et je me suis aperçu que tu utilisais "Show()" pour afficher le second formulaire alors que moi j'utilise "ShowDialog()" pour un affichage modal.

Dans mon code, je change en "Show()" et je m'aperçois que ça marche ... je suis sur la bonne route.

Dans ton code, je change en "ShowDialog()"  et ça marche encore ... donc je regarde à la loupe cet endroit de mon code ....

et  Eureka .... ma ligne d'abonnement à l'évènement était écrite APRES le "ShowDialog()" , donc non prise en compte  (emmêlée dans des lignes de commentaires).

J'ai re écrit cette partie du code et tout marche comme je le souhaite.

Grace à toi ... GRAND  MERCI  pour ta disponibilité

  J'aurai certainement encore besoin de vos compétences  .... mais comme "chez le docteur" le plus tard possible  (rires).

Grossière erreur stupide de ma part voila la conclusion.

   Molo2003

0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 656
1 juin 2023 à 08:15

Tant mieux et de rien.

Pense à marquer le sujet résolu.

Je te conseille de passer ton source en 4.8 car c'est la seule avant 6.0 qui sera encore soutenue par windows 11 quelques temps et ça ne devrait pas changer grand chose dans ton code (contrairement à passer en 6 ou 7).


0
molo2003 Messages postés 50 Date d'inscription mardi 9 janvier 2007 Statut Membre Dernière intervention 9 juin 2023
1 juin 2023 à 12:09

Hello  Whismeril;

La procédure pour mettre en "résolu" ? je cherche et ne trouve pas

Merci de m'indiquer.

Molo

0
Rejoignez-nous