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 :

[C# 2.0] Insérer un handler en première position de la liste des handlers


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Par défaut [C# 2.0] Insérer un handler en première position de la liste des handlers
    Bonjour,

    mon problème est plutôt simple, mais pas facile à exprimer dans un bon français !!

    En fait, je voudrais pouvoir ajouter un handler en première position dans la liste des handlers... C'est pas clair, hein ?

    On va prendre un exemple...

    Imaginez que vous définissiez un formulaire, avec un bouton "Fermer".
    Sur ce bouton, vous ajoutez un handler ("btFermer_Click") afin qu'un click déclenche la fermeture du formulaire.

    Ensuite, quelque part ailleurs dans le code, vous ajoutez un handler sur ce bouton, dans le style :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    this.btFermer.Click += new EventHandler(bouton_Click);


    À ce moment, vous avez bien 2 handlers définis sur l'événement click du bouton : celui défini dans le designer.cs, et l'autre que vous accrochez dynamiquement dans le code.
    Ainsi, quand vous cliquez sur le bouton, vous déclenchez les deux procédures, dans l'ordre : btFermer_Click, puis bouton_Click

    Eh ben moi, je voudrais pouvoir exécuter bouton_Click d'abord, puis btFermer_Click

    En gros, au lieu de faire :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    this.btFermer.Click += new EventHandler(bouton_Click);

    Je voudrais pouvoir faire :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    this.btFermer.Click = new EventHandler(bouton_Click) + this.btFermer.Click;


    Et c'est con, mais je suis sûr qu'il y a moyen de faire ça par réflexivité, j'ai déjà vu ça quelque part, mais je retrouve pas...

    Si quelqu'un pouvait m'aider ? Merci d'avance !!

  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 : 44
    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
    Par défaut
    Citation Envoyé par Divadz Voir le message
    Et c'est con, mais je suis sûr qu'il y a moyen de faire ça par réflexivité, j'ai déjà vu ça quelque part, mais je retrouve pas...
    "réflexivité" ? j'avais jamais vu cette traduction là, en général on traduit "reflection" par "réflexion" ou "introspection"

    A priori c'est possible, mais loin d'être simple... j'avais déjà essayé de jouer avec ça y a quelque temps : je voulais juste savoir s'il y avait déjà un handler pour un évènement donné, ben j'ai pas réussi
    Mais en insistant un peu ça doit pouvoir se faire... d'ailleurs, entre temps j'ai fouillé un peu le code du framework avec Reflector, et j'ai une petite idée de la piste à suivre :
    Dans un contrôle Windows Forms les handlers sont maintenus dans une EventHandlerList sous forme d'une liste chaînée de paires key/handler. La clé est un identifiant interne pour l'évènement (en pratique c'est un champ static readonly object), le handler est un delegate (multicast, puisqu'il s'agit d'un évènement).
    Donc, une fois que tu as récupéré ce Delegate, tu dois pouvoir obtenir sa liste d'invocation (GetInvocationList), et la modifier.

    A ta place, je commencerais par aller acheter une boîte d'aspirine

    Bon courage

  3. #3
    Membre averti
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Par défaut
    Citation Envoyé par tomlev Voir le message
    "réflexivité" ? j'avais jamais vu cette traduction là, en général on traduit "reflection" par "réflexion" ou "introspection"
    Je sais, mais à par le "introspection", le reste, c'est quand même de la mauvaise traduction, même si c'est d'usage courant !! Mais pour preuve : http://fr.wikipedia.org/wiki/R%C3%A9flexivit%C3%A9

    Ensuite, sur mon problème, en fait, j'ai réussi à me débrouiller hier soir, et ça marchait vers 23h (on n'a pas idée d'être encore au boulot à cette heure...)
    Et ça correspond bien à ta réponse...

    En gros, pour un événement click, voilà mon code (tout pourri) :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
                // On récupère le champ privé events de la classe Component
                FieldInfo f = typeof(Component).GetField("events", BindingFlags.Instance | BindingFlags.NonPublic);
                EventHandlerList originalList = (EventHandlerList)f.GetValue(this.simpleButton1);
     
                // On récupère l'objet EventClick, qui sert de clé dans la EventHandlerList
                FieldInfo fiEventClick = typeof(Control).GetField("EventClick", BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic);
                Object EventClick = fiEventClick.GetValue(null);
     
                // On récupère le délégué de l'événement click
                Delegate d = originalList[EventClick];
     
                // On ajoute notre délégué combine_Click en première position
                Delegate comb = Delegate.Combine(new EventHandler(this.combine_Click), d);
                originalList[EventClick] = comb;

    Par contre, il faut pas espèrer faire un code totalement secure... Vu qu'on accède à des champs privés, si l'implémentation change, le code ne marche plus.
    Et puis cette notion de EventHandlerList ne marche que pour certains événements (la plupart des événements de base : clasvier, souris, focus, drag'n drop, etc...) pour des objets dérivant de Control.
    La plupart du temps, pour d'autres objets, le code n'est pas le même...

    Je vais sûrement faire une classe permettant de gérer tout ça, je filerais le code, ça peut toujours servir !!

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

Discussions similaires

  1. Casting avancé (à propos des handlers)
    Par g0ldenrno dans le forum VB.NET
    Réponses: 9
    Dernier message: 29/06/2007, 17h43
  2. [FLASH 8] séparation des handlers
    Par luta dans le forum Flash
    Réponses: 4
    Dernier message: 18/10/2006, 14h52
  3. Désélectionner la première ligne d'une liste
    Par Mariboo dans le forum Access
    Réponses: 4
    Dernier message: 11/07/2006, 14h42
  4. Afficher première valeur d'une liste modifiable
    Par alexg81 dans le forum Access
    Réponses: 3
    Dernier message: 15/05/2006, 22h02
  5. Ajouter une colonne en première position
    Par Alexandre T dans le forum Oracle
    Réponses: 22
    Dernier message: 25/10/2005, 11h58

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