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 :

Evenement se déclenchant plusieurs fois


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif Avatar de Pynouz
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 274
    Par défaut Evenement se déclenchant plusieurs fois
    Bonjour,

    Je suis sur un projet de type complément Outlook.
    Je rencontre un problème que je n'arrive pas à régler. Je ne comprend d'ailleurs pas pourquoi il se produit...

    J'ai un objet de type CommandBarButton auquel j'assigne un évenement click.
    Hors lorsque je clique sur ce "Bouton" cet évenement se déclenche une ou plusieurs fois aléatoirement.

    Voici mon code (en simplifié) :

    Création de mes CommandBarButton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    foreach (Bouton btn in partieTotal.Boutons)
    {
           Office.CommandBarButton item = (Office.CommandBarButton)menuDossier.Controls.Add(Office.MsoControlType. msoControlButton, Type.Missing, Type.Missing, Type.Missing, true);
           item.Caption = nom;
           item.Tag = btn.Chemin;
           item.DescriptionText = btn.Mode;
           item.Click += new  Office._CommandBarButtonEvents_ClickEventHandler(item_Click);
    }
    Evenement Click :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void item_Click(Office.CommandBarButton Ctrl, ref bool CancelDefault)
    {
    }

  2. #2
    Membre très actif Avatar de Pynouz
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 274
    Par défaut
    J'ai finalement trouvé la solution.

    Il faut "vider" le garbage collector à la fin de mon évenement.
    Si cela n'est pas fait il semble que un commandBarButton se réabonne à l'évenement "Click". Il s'abonnait donc plusieurs dois.

    Pour vider le garbage collector :

  3. #3
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut

    Tu en es sûr ???
    Je pense plutôt que c'est un abonnement foireux qui te pose problème,
    Ta boucle fonctionne correctement ? dans le code que tu as retiré, il n'y a pas un truc qui cloche ? Ou à l'exécution, tu ne fais pas de ping-pong ?

  4. #4
    Membre très actif Avatar de Pynouz
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 274
    Par défaut
    Bonjour,

    Non, en faite, j'instancie des CommandBarButton à chaque appel de l'événement "Application_ItemContextMenuDisplay".
    A ces CommandBarButton je leur assigne des valeurs au niveau de leur propriété Tag (je le conçois c'est vraiment pas propre) et en faite le problème vient à ce niveau.
    En effet, même lorsque l'objet à été "détruit" (.Delete() le .Dispose() n'existe pas pour ce type d'objet) il apparait qu'il garde une trace dans le garbage collector et lorsque je réinstancie un objet ayant le même Tag il récupère l'abonnement à l’évènement du précédent d'où une multiplicité de ces abonnements.
    J’arrête donc d'utiliser le Tag et le problème à disparu. Je vide quand même le garbage collector à la fin de ma méthode.

    Cependant, je ne suis pas très au point sur ces systèmes de garbage collector. Donc, si tu veux apporter quelques précisions ou informations sur le sujet j'en suis très friand .

  5. #5
    Membre émérite Avatar de kheironn
    Homme Profil pro
    Chef de projets technique C# / MVC / .Net
    Inscrit en
    Février 2007
    Messages
    823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projets technique C# / MVC / .Net
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2007
    Messages : 823
    Par défaut
    Ben tu n'es pas censé appeler le GC toi-même.
    Si des objets ne sont pas disposables, charge à toi de leur faire implémenter IDisposable si le besoin s'en fait ressentir. Je ne connais pas CommandBarButton et tu ne peux peut-être pas le faire implémenter l'interface en question.
    J'avoue que je n'ai jamais fait de dev pour office.

    Mais je pense que le problème est dans la conception.
    Pourquoi dois-tu faire plusieurs instanciation de cette bar ? Une fois créée, elle mène sa vie toute seule ?
    Peux-tu me donner ton besoin fonctionnel ?

  6. #6
    Membre très actif Avatar de Pynouz
    Profil pro
    Inscrit en
    Juin 2010
    Messages
    274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2010
    Messages : 274
    Par défaut
    J'ajoute en faite au menu contextuel plusieurs CommandBarButton. Leur nombre est variable. L'utilisateur peut décider d'en rajouter et d'en supprimer dans un formulaire outlook.
    J'instancie donc ces boutons à la volée à chaque fois que l'utilisateur fais un clic droit sur un email donc lorsque le menu contextuel apparait (et est instancié).

    De plus, j'ai vérifier en pas à pas détaillé la composition du menu contextuel et il n'apparait aucun doublons de ces boutons.
    J'avais trouver la solution exposée ci-dessus sur un site (je n'ai cependant plus la source).

    edit: Il me semble sauf erreur de ma part que le menu contextuel se recrée à chaque clic droit sur un email.

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

Discussions similaires

  1. Evenement formclosing (capter plusieurs fois )
    Par Pasges dans le forum VB.NET
    Réponses: 8
    Dernier message: 19/04/2011, 20h24
  2. Réponses: 6
    Dernier message: 15/07/2010, 16h26
  3. Réponses: 1
    Dernier message: 30/12/2006, 10h30
  4. Réponses: 2
    Dernier message: 10/07/2004, 17h14
  5. [Servlet] Comment utilisé une servlet plusieurs fois ?
    Par gandalf_le_blanc dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 03/06/2004, 14h49

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