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 :

SelectedValue ou Item dans combobox


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut SelectedValue ou Item dans combobox
    Bonjour

    Pour la premiere fois j'utilise un ComboBox non bindé mais populé a l'aide du designer

    Et le comportement est différent d'un combo bindé j'ai l'impression d'etre devenu idiot !

    1er probleme
    J'ai introduit (via le designer) 4 valeurs : 1,2,3,4 (les trimestres d'une année)
    J'attends que le combo me propose par défaut la valeur 1 mais une valeur nulle a été introduite et le combo est blanc par défaut : peut on changer cela (dans un combo bindé c'est plutot l'inverse qui pose problème)

    2eme probleme
    Je m'attends naturellement a pouvoir assigner par programmation le selectedvalue ou le selecteditem a une valeur precise 1,2,3, ou 4
    Ca ne marche pas il faut apparement basser par la propriété Text !

    Ais-je perdu la tete en ce début d'année ?

    Merci de votre expérience !

  2. #2
    Expert confirmé 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
    Par défaut
    Pour la premiere fois j'utilise un ComboBox non bindé
    Surprenant !

    Dans le designer, mettre la property DropDownStyle à DropDownList.

    Comme on ne peut pas initialiser la property SelectedIndex dans le Designer, le faire à l'exécution après InitializeComponents().

    Dans une ComboBox de style DropDownList, il faut considérer la property Text comme "ReadOnly" et si on veut la changer modifier le SelectedIndex.

  3. #3
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci Graffito

    C'est franchement un boulet ce truc !

    Je dois donc ecrire une methode qui va me retrouver l'index dans le combo en fonction de la valeur de l'item que je veux selecter !!

    Je comprends pourquoi je n'ai jamais utilisé le designer pour definir les valeurs de mes combos .

    Voici une methode un peu plus conviviale qui permet d'utiliser la valeur en direct !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          int[] TrimL = new int[] { 1, 2, 3, 4 };
          cmbTrim.DataSource = TrimL;
          cmbTrim.SelectedItem = 4;

  4. #4
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    bonjour olibara
    D'abord bonne annee.
    Premierement pour le combobox ,il y a lieu de se rappeler peut etre qu'il affiche dans son textbox de selection un blanc car le SelectedIndex est initialise à -1,lorsque le combo n'est pas binde.
    Mais on peut affecter zero à SelectedIndex pour afficher immediatement le
    1er element.
    citation msdn:
    Vous ne pouvez pas affecter -1 au SelectedIndex d'un élément ComboBox si l'élément est lié aux données.
    Deuxiement ,lorsque on remplit la collection items a partir du Designer avec une liste de type "String" ,ne pas oublier :
    -d'appeler la method ToString du "Object SelectedItem" dans le cas d'un type String .
    Quand au SelectedValue il n'est pas defini si ComboBox n'est pas binde à un Ilist.
    Dans ce cas IList d'un class particulier ,DisplayMember (propriete du class) et ValueMember(propriete du class) sont à definir par vos soins.....
    voici un bout de code qui n'as rien de special:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    'le combo est popule comme suit à partir du designer:
    '1er Trimestre 2012
    '2er Trimestre 2012
    '3er Trimestre 2012
    '4er Trimestre 2012
    Public Class Form1
    	Public Sub New()
     
    		' Cet appel est requis par le Concepteur Windows Form.
    		InitializeComponent()
     
    		' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
    		Me.ComboBox1.SelectedIndex = 0
     
    	End Sub
    	Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    		Me.Label1.Text = Me.ComboBox1.SelectedItem.ToString
    	End Sub
     
    End Class
    bon code ...........

  5. #5
    Membre expérimenté
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Par défaut
    Merci Mabrouki

    Pour le point 1 effectivement je comprends maintenant la nuance et c'est clair !

    Premierement pour le combobox ,il y a lieu de se rappeler peut etre qu'il affiche dans son textbox de selection un blanc car le SelectedIndex est initialise à -1,lorsque le combo n'est pas binde.
    Par contre je suis maintenant convaincu que définir les valeurs du combo a partir du designer entraine des bricolages tordu si l'on veut definir l'element selecté (ou la valeur selectée) par programmation
    Etre obligé de connaitre l'index nécessite des détour désagréable

    Je prefere donc creer une List ou un tableau et le binder au combo pour avoir un comportement plus "naturel"

  6. #6
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut
    rebonjour olibara
    excuse -moi .En relisant le post j'ai compris le veritable souci,c'est modifier un item.
    Comme le Combo gere en interne une liste pour stocker ses elements la prop Items ne peut etre utilise que pour add,insert et remove...pu une lecture...
    Le seul moyen de modifier un Item dans l'evenement SelectedIndex est de:
    - recuperer l'index courant
    - d'inserer le nouvel element de remplacement avant cette position
    -de supprimer l'element existant à cette position..... ce qui maintient la liste inchange.....
    le code avec un bouton de saisie du texte de de remplacement de l'item selectionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    'le combo est popule comme suit à partir du designer:
    '1er Trimestre 2012
    '2er Trimestre 2012
    '3er Trimestre 2012
    '4er Trimestre 2012
    Public Class Form1
    	Public Sub New()
     
    		' Cet appel est requis par le Concepteur Windows Form.
    		InitializeComponent()
     
    		' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
    		Me.ComboBox1.SelectedIndex = 0
    		Me.Label1.Text = Me.ComboBox1.SelectedItem.ToString
    	End Sub
    	Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    		Me.TextBox1.Text = "Hola!"
    	End Sub
    	Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
    		Dim currentPos As Integer = ComboBox1.SelectedIndex
    		If Me.TextBox1.Text <> String.Empty Then
    			Me.ComboBox1.Items.Insert(ComboBox1.SelectedIndex, Me.TextBox1.Text)
    			Me.ComboBox1.Items.RemoveAt(ComboBox1.SelectedIndex)
    			Me.TextBox1.Clear()
    		End If
    		'position la selection sur l'element courant 
    		Me.ComboBox1.SelectedIndex = currentPos
     
    	End Sub
     
     
     
    End Class
    bon code................

  7. #7
    Expert confirmé 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
    Par défaut
    C'est franchement un boulet ce truc !
    T'as pas tort.
    Mais j'y suis tellement habitué depuis Delphi1 que j'y faisais même plus attention.

    Mais dans le style boulet, la ComboBox bindée à un DataSource est encore pire (carrément inutisable ) quand on veut faire simplement du DropDown pour proposer un choix de valeurs, tout en permettant d'en saisir une hors de la liste..

  8. #8
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 1 048
    Par défaut
    Le comboBox fournit de base avec Winforms est définitivement pas la meilleur réalisation de microsoft.

    C'est ptete pour qu'on arrête d'en mettre partout avec des listes de 1'000 éléments!

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2013
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 7
    Par défaut Comment conserver l'index en cas de saisie plutôt que sélection
    Bonjour,

    Je reviens sur la dernière remarque de Graffito.

    J'ai une ComboBox dont le Drop0DownStyle est DropDown, donc j'autorise la saisie d'une nouvelle valeur. Son DataSource est un DataTable remplit par une requête SQL et comprenant 3 colonnes. Lorsque je sélectionne une valeur dans la liste de mon ComboBox, je récupère en fait les informations des 3 colonnes, et au passage je récupère aussi l'index interne à la ComboBox pour info. Jusqu'ici tout va bien!

    Lorsqu'au lieu de sélectionner dans la liste, on saisit quelque chose dans la zone prévue à cette effet, le SelectIndex vaut -1, .Puisqu'aucune valeur de la liste n'a été sélectionnée, c'est logique. Donc ca me va bien!

    Mais je fais aussi un test sur la valeur saisie pour savoir si par hasard, l'utilisateur ne ressaisirait pas une valeur déjà existante dans ma liste. Auquel cas, je voudrais que l'index soit repositionné sur la valeur correspondante de la liste. Donc, si par exemple le texte saisi correspond au texte de la liste à l'index 3, j'ai écrit dans mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ComboBox_Company.SelectedIndex = ComboBox_Company.Items.IndexOf(ComboBox_Company.Items(i))
    (Je fais une boucle i sur la collection d'items de ma Combobox). Et ca marche toujours!

    MAIS LA... C'EST LE DRAME! dès que je perds le focus de ma ComboBox, par exemple en cliquant sur le bouton "Valider" de mon formulaire, le SelectIndex revient systématiquement à -1 !!!?????

    Si quelqu'un peut m'expliquer pourquoi et surtout comment conserver l'index trouvé...


    Les logiciels utilisés sont :

    - Windows 7 Professionnel SP1
    - SQL Server 2008 R2
    - Visual Studio 2010 Professional

Discussions similaires

  1. boucle pour rajouter des items dans combobox
    Par panda78 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 02/08/2012, 04h46
  2. [XL-2007] Changer police item dans ComboBox
    Par Bugzy1963 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 26/05/2010, 18h34
  3. Ajouter FontFamily items dans combobox
    Par olibara dans le forum Windows Forms
    Réponses: 11
    Dernier message: 25/07/2009, 17h34
  4. Réponses: 6
    Dernier message: 28/02/2008, 18h58
  5. [VB.NET] Recherche d'item dans ComboBox
    Par arno2000 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 13/12/2005, 14h07

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