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

Windows Forms Discussion :

Désactiver les événements


Sujet :

Windows Forms

  1. #1
    Membre régulier
    Profil pro
    Ingénieur de développement
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur de développement

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 96
    Points
    96
    Par défaut Désactiver les événements
    Bonjour à tous.


    Dans le code suivant,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void Form1_Load(object sender, EventArgs e)
    {
           listBox1.Items.Add("aaaaa");
           listBox1.Items.Add("bbbb");
           listBox1.Items.Add("cccc");
           listBox1.SelectedIndex = 1;
    }
     
    private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
            MessageBox.Show("Activé");
    }

    la ligne "listBox1.SelectedIndex = 1;" a pour effet de déclencher la méthode "listBox1_SelectedIndexChanged". Normal !!

    Mais si je ne veux pas que cela arrive, comment faire ? on peut se débrouiller avec un quelconque flag mais n'y a t il pas un moyen plus "propre" ?

    Je pensais que le "SuspendLayout" et le "ResumeLayout" auraient pu m'aider mais non !

    Avez-vous des idées ?

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Nico28 Voir le message
    on peut se débrouiller avec un quelconque flag mais n'y a t il pas un moyen plus "propre" ?
    Pas vraiment... tu peux te désabonner temporairement de l'évènement et te réabonner ensuite, mais c'est pas vraiment plus pratique

  3. #3
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Nico28 Voir le message
    Avez-vous des idées ?
    Tout sîmplement (dans le cas que tu donnes) abonner tes événements en fin de Form_load plutôt que dans le constructeur ou dans le InitializeComponent

    Mais, sinon, non, il n'existe pas de méthode externe à une instance permettant de lui dire de ne pas "lever" ses évenements.

    Je ne réponds pas aux questions techniques par MP ! Le forum est là pour ça...


    Une réponse vous a aidé ? utiliser le bouton

    "L’ennui dans ce monde, c’est que les idiots sont sûrs d’eux et les gens sensés pleins de doutes". B. Russel

  4. #4
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Comme l'indique tomlev, encadres le changement d'index par une déactivation/réactivation de l'event :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    listBox1.SelectedIndexChanged -= listBox1_SelectedIndexChanged ;
    listBox1.SelectedIndex = 1;
    listBox1.SelectedIndexChanged += listBox1_SelectedIndexChanged ;
    Remarque : la désactivation d'un event ne gènére pas d'exception si l'event n'est pas encore activé ou a déjà été désactivé.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  5. #5
    Membre régulier
    Profil pro
    Ingénieur de développement
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur de développement

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 96
    Points
    96
    Par défaut
    Merci de vos réponses.

    J'avais pensé à cela mais il faut effectivement désabonner TOUS les évenements qui me gêne.

    J'aurais aimé une technique globale de déactivation de tous les événements pour l'objet considéré.


    En fait, le problème se pose souvent à l'initialisation d'un formulaire, lorsqu'on configure/met à jour les différentes listes, cases à cocher et autres boutons radio. Les événements sont générés en cascade et on obtient parfois des situations incohérentes (à l'intérieur du programme).

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Nico28 Voir le message
    J'aurais aimé une technique globale de déactivation de tous les événements pour l'objet considéré.
    Ca n'existe pas... Certains composants ont une propriété EnableRaisingEvents, mais ce n'est pas le cas des contrôles

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2009
    Messages
    2 025
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2009
    Messages : 2 025
    Points : 5 462
    Points
    5 462
    Par défaut
    Ben si c'est un problème récurrent lors de l'initialisation tu peux toujours mettre un boolean et dans tout tes events tu tests cette variable.
    Quand tu estimes que les initialisations sont finis tu changes le boolean.

    Bon ca marche que dans un contexte "d'initialisation", et les evenements sont quand meme appelé...

  8. #8
    Membre régulier
    Profil pro
    Ingénieur de développement
    Inscrit en
    Avril 2005
    Messages
    169
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur de développement

    Informations forums :
    Inscription : Avril 2005
    Messages : 169
    Points : 96
    Points
    96
    Par défaut
    Citation Envoyé par micka132 Voir le message
    Ben si c'est un problème récurrent lors de l'initialisation tu peux toujours mettre un boolean et dans tout tes events tu tests cette variable.
    Quand tu estimes que les initialisations sont finis tu changes le boolean.

    C'est ce qui est fait pour le moment.

  9. #9
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Ca n'existe pas... Certains composants ont une propriété EnableRaisingEvents, mais ce n'est pas le cas des contrôles
    Au pire ça s'implémente, il suffit de surcharger le contrôle et ses méthodes On[...] afin de ne pas raise l'event si la propriété est à true.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par ctxnop Voir le message
    Au pire ça s'implémente, il suffit de surcharger le contrôle et ses méthodes On[...] afin de ne pas raise l'event si la propriété est à true.
    Oui mais bon, s'il faut se faire une version customisée de chaque contrôle standard, c'est un peu galère...

  11. #11
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Bah, ça n'est à faire qu'une fois, et seulement pour les contrôles pour lesquels ont veut la fonctionnalité. C'est pas bien la mort et ça évite de refaire la même astuce à chaque fois qu'on en à besoin.
    Ceci-dit, je trouve très con de la part de Microsoft de ne pas avoir intégré ça en standard dans les winforms.

  12. #12
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Ceci-dit, je trouve très con de la part de Microsoft de ne pas avoir intégré ça en standard dans les winforms.
    On peut créer une fonction statique récursive pour sauvegarder/désactiver les events de chaque control et de ses enfants. On passera à cette fonction le control (la form au départ) et elle mettra à jour un objet contenant la sauvegarde.

    Une deuxième procédure statique avec comme paramètre d'entrée l'objet de sauvegarde permettra de restaurer les events sauvegardés.

    On pourra se baser sur ce lien pour les fonctions permettant de supprimer/restaurer un event ou tous les events d'un control:
    http://www.frafru.info/index.php?db=so&id=91778
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  13. #13
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    C'est ce que j'appelle une usine à gaz.
    1. Tu ne peux pas choisir unitairement les contrôles.
    2. Tu ne peux pas choisir unitairement l'évènement à désactiver.
    3. Tu boucle récursivement sur une arborescence de contrôle qui peut être TRES grosse, contenant également les contrôles internes (genre la scrollbar d'un panel trop grand pour son parent), et donc c'est potentiellement bien lent.
    4. Tu te sert de la reflexion pour retrouver la liste des events, ce qui est très lent (sans compter le manque d'optimisation vis à vis du fait si tu fais deux System.Windows.Forms.Button à la suite, tu refais le même code de reflexion très lent)

    Alors a moins que ce soit justifié par le fait qu'il ait besoin de désactiver tous les évents, souvent, à pleins d'endroits différents, quelque soit le contrôle, la solution d'origine (celle du flag) me parait plus adaptée.

  14. #14
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    C'est ce que j'appelle une usine à gaz.
    C'est aussi mon avis, mais je voulais juste indiquer que c'était faisable.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

Discussions similaires

  1. désactiver/activer les évènements
    Par olivierPa dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 31/10/2009, 18h37
  2. Réponses: 8
    Dernier message: 08/03/2009, 18h30
  3. désactiver les contraintes
    Par romainw dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 15/07/2004, 10h46
  4. [COM] Comment utiliser les événements Word ?
    Par Laurent Dardenne dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 30/05/2004, 12h38
  5. Désactiver les touches F1, F2, F3, F4, F5 dans IE
    Par ZiZouJH dans le forum Flash
    Réponses: 7
    Dernier message: 17/02/2003, 09h59

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