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 :

[vb.net][combobox] récupérer la valeur avant changement


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut [vb.net][combobox] récupérer la valeur avant changement
    Bonjour,

    Je n'arrive pas a trouver sur quel évenement je dois récuperer la valeur d'une combobox avant que l'utilisateur ne selectionne une autre valeur. (je pourrais faire une sauvegarde mais bon... dans le control dropdownlistcolumn il y a cellChanging et cellChanged, alors pourquoi pas avec une combobox...)


    Merci

  2. #2
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627

  3. #3
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    salut,
    mais tous ces évenements me donne la valeur apres qu'elle ait été changée. Comment récupérer la valeur avant qu'elle soit changé ?

  4. #4
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    ah ok
    dans ce cas pense toujours que les evenements connus d'un contrôle ont leur declencheur "OnEvenement" dans la classe de base - Ici par exemple OnTextChanged
    Donc fait ton propre ComboBox dérivé de ComboBox pour recupérer cette méthode protégé et y faire ce que bon te semble

  5. #5
    Membre éprouvé
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Par défaut
    Sinon, tu peux aussi tout simplement garder une copie de cette valeur que tu ne mets à jour qu'à la fin de ton traitement.

    Quelque-chose dans le genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        public partial class myForm : Form
        {
            private MyObject myValue; 
     
            private void myComboBox_SelectedIndexChanged(object sender, EventArgs e)
            {
                //
                // Traitement utilisant myValue
                //
     
                myValue = (MyObject) myComboBox.SelectedItem;
            }
        }

  6. #6
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Citation Envoyé par Wyatan
    Sinon, tu peux aussi tout simplement garder une copie de cette valeur que tu ne mets à jour qu'à la fin de ton traitement.
    Quelque-chose dans le genre...

    Citation Envoyé par graphicsxp
    (je pourrais faire une sauvegarde mais bon...

  7. #7
    Membre éprouvé
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Par défaut


    Bon, cela dit, c'est sans doute que mon cerveau a refusé de traiter la notion qu'on puisse perdre du temps à fouiller dans la doc et à demander sur le forum une solution à un problème pour lequel on dispose déjà d'une solution hyper simple.

    On va dire ça, hein ?

  8. #8
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Citation Envoyé par Wyatan


    Bon, cela dit, c'est sans doute que mon cerveau a refusé de traiter la notion qu'on puisse perdre du temps à fouiller dans la doc et à demander sur le forum une solution à un problème pour lequel on dispose déjà d'une solution hyper simple.

    On va dire ça, hein ?
    heu non désolé... on va pas dire ça.... cette solution est simple mais crade... il faudrait le faire pour toutes les combobox, pas tres efficace, tu trouves pas ?

  9. #9
    doccpu
    Invité(e)
    Par défaut
    Hérite d'une combobox !

  10. #10
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Citation Envoyé par doccpu
    Hérite d'une combobox !
    Merci de confirmer
    Citation Envoyé par neguib
    ah ok
    dans ce cas pense toujours que les evenements connus d'un contrôle ont leur declencheur "OnEvenement" dans la classe de base - Ici par exemple OnTextChanged
    Donc fait ton propre ComboBox dérivé de ComboBox pour recupérer cette méthode protégé et y faire ce que bon te semble

  11. #11
    Membre éprouvé
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Par défaut
    heu non désolé... on va pas dire ça....
    Quoi, on n'a plus le droit de faire preuve de mauvaise foi, peut-être ?

    cette solution est simple mais crade... il faudrait le faire pour toutes les combobox, pas tres efficace, tu trouves pas ?
    C'est qu'en plus tu en as besoin pour toutes les combobox de ton formulaire ?

    De toute façon, j'ai peur que tu n'aies à en passer par ce genre de solution "crade" : même en créant ta propre classe qui hérite de ComboBox (et est-ce vraiment plus "propre" pour exposer une seule propriété ?), je ne vois pas sur quelle méthode tu pourrais faire un override puisque toutes les méthodes protégées qui lèvent un événement se rapportant à un changement de sélection semblent être appelées après le changement...

    Donc tu risques de te retrouver à juste encapsuler la "solution crade", avec l'ajout d'une propriété du genre PreviousSelectedItem.

    Sinon, tu peux aussi tout simplement utiliser la propriété Tag pour y sauvegarder cette valeur, sans passer par l'héritage. C'est "crade" aussi, et pas sémantique, mais au moins la valeur serait enregistrée au niveau de l'objet auquel elle se rapporte, et non du formulaire...

  12. #12
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Citation Envoyé par Wyatan
    est-ce vraiment plus "propre" pour exposer une seule propriété ...
    C'est effectivement à mon humble avis plus 'propre' lorsqu'il s'agit de repeter l'operation sur plusieurs contrôles de même nature. Quand à l'héritage il permet également d'ajouter simplement un nouvel evenement avec son delegué eventuellement

  13. #13
    Membre éprouvé
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Par défaut
    C'est effectivement à mon humble avis plus 'propre' lorsqu'il s'agit de repeter l'operation sur plusieurs contrôles de même nature.
    Ca dépend, et on manque d'infos pour en juger.
    S'il s'agit d'un contrôle amené à être fréquemment utilisé au travers de l'application, alors oui, en effet.
    Si en revanche il s'agit juste de 2-3 combobox sur un formulaire précis, alors je ne suis pas convaincu qu'ajouter une classe pour s'épargner 2-3 variables d'instance soit réellement plus "propre".

    Quand à l'héritage il permet également d'ajouter simplement un nouvel evenement avec son delegué eventuellement.
    Certes.
    Mais le problème consiste justement à lever l'événement au bon endroit, et en examinant les méthodes protégées disponibles, et après quelques tests, c'est justement ce que je vois pas...
    Mais :
    1- J'ai tout à fait pu passer à côté d'une possibilité.
    2- J'ai fait mes tests en C#, peut-être que VB offre d'autres possibilités dans ce cas précis.

  14. #14
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Citation Envoyé par Wyatan
    peut-être que VB offre d'autres possibilités dans ce cas précis.
    Hmm sur ce coup je te fait plutôt confiance, çà m'etonnerai que VB.Net fasses mieux mais si j'ai un peu de temps cet après midi je vais aussi voir de mon côté en Vb.Net @+

  15. #15
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut Re: [vb.net][combobox] récupérer la valeur avant changement
    Citation Envoyé par graphicsxp
    Je n'arrive pas a trouver sur quel évenement je dois récuperer la valeur d'une combobox avant que l'utilisateur ne selectionne une autre valeur.
    En partant de ce besoin j'ai remarqué la suite des evenements suivants
    (resultat d'un petit test VB mais tout aussi valable en C#)
    A. En partant de la zone d'edition vide: sur une selection user
    • 1. Enter
      2. Click
      3. SelectionChangeCommitted
      4. TextChanged
      5. SelectedValueChanged
      6. SelectedIndexChanged

    B. En partant de la zone d'edition rempli:sur une selection user
    • Après le click même suite exacte des evenements

    C. En écrivant dans la zone d'edition déjà remplie:
    • 1. KeyDown
      2. KeyPress
      3. TextChanged
      4. KeyUp


    En conclusion
    Citation Envoyé par MSDN
    Vous pouvez créer un gestionnaire d'événements SelectionChangeCommitted pour effectuer un traitement spécial pour le ComboBox quand l'utilisateur change d'élément sélectionné dans la liste.
    Soit intervenir au moment de cet event pour la combo en cours soit en amont (si necessaire) dans une classe derivée sur OnSelectionChangeCommitted

  16. #16
    Membre éprouvé
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Par défaut
    La propriété SelectedItem a déjà été changée lorsque l'événement OnSelectionChangeComitted est levé (c'est d'ailleurs logique, d'après son nom ).

    En revanche, il apparaît en effet que l'événement OnSelectionChangeComitted est levé avant que la propriété Text ne soit affectée par le changement, donc à ce moment, myComboBox.Text correspond au "DisplayMember" (ou à la valeur de retour de la méthode ToString()) de la sélection précédente.

    Si la valeur qui intéresse graphicsxp est justement cette chaîne, alors c'est une bonne solution.

    En revanche, si ce n'est pas cette valeur, il reste tout à fait possible de retrouver dans la collection d'Items celui qui correspond à cette chaîne (sauf si des doublons sont possibles à l'affichage), mais le traitement sera plus lourd, et donc pas forcément plus élégant, et certainement moins performant.

    Enfin, un léger caveat mais qui ne s'applique sans doute pas dans ce cas, d'après la description du problème : cet événement n'est levé que lorsque le changement de sélection est dû à une action de l'utilisateur, pas lorsqu'il résulte d'un traitement.

  17. #17
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    Ben avec tout çà j'espère que notre ami Graphicx va trouver son bonheur dès lundi matin

  18. #18
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Merci pour vos réponses. houla c'est Lundi matin, il faut que je m'y remette douuuucement.

    Neguib, si j'utilise OnSelectionChangeCommitted pour vérifier la nouvelle valeur de ma combobox, comment puis-je pour autant annuler ou valider ce changement? Car c'est bien ce que je cherche a faire ici. Une fois cet évenement appellé, SelectedItem vaut la nouvelle valeur et par conséquent je ne vois pas comment revenir à la valeur précédente (sans passer par une sauvegarde)

    Au bout du compte je me demande si utiliser une variable Static dans SelectedIndexChanged n'est pas la meilleure solution....

  19. #19
    Membre éprouvé
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Par défaut
    si j'utilise OnSelectionChangeCommitted pour vérifier la nouvelle valeur de ma combobox, comment puis-je pour autant annuler ou valider ce changement?
    Hmm... tu veux dire que ton appli va expliquer à l'utilisateur qu'il n'a éventuellement pas le droit d'opérer la sélection qui pourtant lui était proposée ?
    Si c'est bien ça, il me semble que le plus propre serait de très loin de gérer la question en amont, en filtrant et en n'affichant que les choix valides...

    Sinon, et bien en utilisant l'événement en question, tu peux toujours retrouver la valeur qui correspond à la propriété Text, et la réaffecter à SelectedItem.

    Au bout du compte je me demande si utiliser une variable Static dans SelectedIndexChanged n'est pas la meilleure solution....
    "static ?"
    Ah non, ça, ça ne serait vraiment pas bô !
    Variable d'instance, ou éventuellement, affectation à la propriété Tag de ta combobox...

  20. #20
    Membre éprouvé Avatar de graphicsxp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    758
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : Luxembourg

    Informations forums :
    Inscription : Avril 2004
    Messages : 758
    Par défaut
    Si c'est bien ça, il me semble que le plus propre serait de très loin de gérer la question en amont, en filtrant et en n'affichant que les choix valides...
    Le choix est valide, mais c'est en fait un item 'more...' qui permet a l'utilisateur de charger des entrées suplémentaires dans la combo, de ce fait je n'ai pas à charger tout en meme temps.

    "static ?"
    Ah non, ça, ça ne serait vraiment pas bô !
    Variable d'instance, ou éventuellement, affectation à la propriété Tag de ta combobox...
    Moi les variables static ne me choquent pas et puis ca marche bien comme ca. Si tout le monde me répond en disant que ce n'est pas une bonne méthode je changerais ca (peut etre) en variable membre...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. récupérer une valeur avant de la modifier avec RegExp
    Par yodark dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 14/02/2011, 16h51
  2. Réponses: 5
    Dernier message: 14/06/2008, 13h30
  3. [VB.net][OleDB]récupérer la valeur d'un parametre de sortie
    Par glanumf dans le forum Accès aux données
    Réponses: 4
    Dernier message: 17/10/2006, 17h09
  4. Réponses: 2
    Dernier message: 15/06/2005, 15h57
  5. [VB.NET] [ODBC] Récupérer des valeurs avec requête ODBC?
    Par Pleymo dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/03/2005, 16h38

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