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 :

Combobox et SelectedValueChanged


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Par défaut Combobox et SelectedValueChanged
    Bonjour,
    j'ai un Combobox que je remplis dans le load de ma page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     Dim DS As New DataSet()
            DS.ReadXml("filieres.xml")
            Dim rowFil As DataRow
            rowFil = DS.Tables("filiere").NewRow()
            rowFil.Item("id") = "00"
            rowFil.Item("filiere_Text") = ""
            DS.Tables("filiere").Rows.Add(rowFil)
            CB_Filiere.DataSource = DS.Tables("filiere")
            CB_Filiere.DisplayMember = "filiere_Text"
            CB_Filiere.ValueMember = "id"
            CB_Filiere.SelectedValue = "00"
    Maintenant je rajoute du code car je voudrais modifier un bouton selon l'élément sélectionné de mon combobox
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     Private Sub CB_Filiere_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles CB_Filiere.SelectedValueChanged
            'Debloque le bouton d'accès au tableau si données existantes
            If CB_Filiere.SelectedValue = "00" Then
                BtnNegoc.Enabled = False
            Else
                If Me.NegocDataSet.Tables("pcv").Select("Filiere='" & CB_Filiere.SelectedValue & "'").Length > 1 Then
                    BtnNegoc.Enabled = True
                Else
                    BtnNegoc.Enabled = False
                End If
            End If
        End Sub

    Et le truc que je ne comprend pas c'est que la fonction CB_Filiere_SelectedValueChanged est déclénchée sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CB_Filiere.DataSource = DS.Tables("filiere")
    Ce qui du coup me donne l'erreur sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If CB_Filiere.SelectedValue = "00" Then
    Car je n'ai encore rien sélectionné dans ma combo, je suis en train de définir le datasource.....
    Où dois-je mettre mon code qui se déclenchera quand l'utilisateur changera de valeur dans la combo.
    J'ai essayé SelectedIndexChange et TextChange mais ils se déclenchent tous sur ma déclaration DataSource de ma combo....
    Merci

  2. #2
    Membre Expert Avatar de Danyel
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juillet 2005
    Messages
    1 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 699
    Par défaut
    Mettre le combobox sur disable pendant le chargement.

  3. #3
    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 : 43
    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 charliejo Voir le message
    Et le truc que je ne comprend pas c'est que la fonction CB_Filiere_SelectedValueChanged est déclénchée sur la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CB_Filiere.DataSource = DS.Tables("filiere")
    C'est normal, le fait d'affecter une DataSource change l'élément sélectionné (même si c'est pour sélectionner Nothing)

    Citation Envoyé par charliejo Voir le message
    Ce qui du coup me donne l'erreur sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If CB_Filiere.SelectedValue = "00" Then
    Quelle erreur ? Désolé, je n'ai pas de boule de cristal
    Je ne vois pas de raison pour que cette instruction déclenche une erreur, tu es sûr que c'est bien sur cette ligne ?

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Par défaut
    Oui j'ai bien une erreur sur cette ligne car n'ayant aucune valeur dans sélectionné il me gère une erreur !!!!!

  5. #5
    Rédacteur

    Avatar de Jean-Michel Ormes
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2007
    Messages
    1 838
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Services à domicile

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 838
    Par défaut
    Citation Envoyé par charliejo Voir le message
    Oui j'ai bien une erreur sur cette ligne car n'ayant aucune valeur dans sélectionné il me gère une erreur !!!!!
    Comme l'a dit @tomlev, si tu ne donnes pas le message d'erreur que tu obtiens, on ne pourra pas t'aider

  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 : 43
    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 charliejo Voir le message
    Oui j'ai bien une erreur sur cette ligne car n'ayant aucune valeur dans sélectionné il me gère une erreur !!!!!
    Le fait de ne pas avoir de valeur sélectionnée n'est pas une erreur. SelectedValue vaut Nothing, donc ce n'est pas égal à "00", donc tu ne rentres pas dans le If... Donc, encore une fois, je ne vois pas quelle erreur pourrait bien être générée à cette ligne, et tant que tu ne nous l'auras pas dit on ne pourra rien pour toi

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 582
    Par défaut
    J'ai l'erreur
    L'exception InvalidCastException n'a pas été géré par le code utilisateur La résolution de surcharge a échoué, car aucun '=' Public ne peut être appelé avec ces arguments : 'Public Shared Operator =(a As String, b As String) As Boolean': L'argument qui correspond au paramètre 'a' ne peut être converti en 'DataRowView' en 'String'
    Si J'aoute sur mon "SelectedValueChanged" le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Msgbox (CB_Filiere.SelectedValue.ToString())
    J'ai
    System.Data.DataRowView
    Et ma fonction SelectedValueChanged est bien déclenchée par la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CB_Filiere.DataSource = DS.Tables("filiere")
    Merci

  8. #8
    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 : 43
    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
    L'exception InvalidCastException n'a pas été géré par le code utilisateur La résolution de surcharge a échoué, car aucun '=' Public ne peut être appelé avec ces arguments : 'Public Shared Operator =(a As String, b As String) As Boolean': L'argument qui correspond au paramètre 'a' ne peut être converti en 'DataRowView' en 'String'
    Argh... voilà une des nombreuses raisons pour lesquelles j'aime pas Visual Basic
    Normalement ça aurait du être résolu à la compilation, pas à l'exécution... SelectedValue est déclaré comme étant de type Object, donc le test d'égalité avec une String aurait dû être un appel à Equals, et y aurait pas eu cette erreur.

    Enfin bon, mettons entre parenthèses le fait que VB est un langage de m***e, et cherchons une solution...

    En fait, quand tu affectes une DataTable comme DataSource du ComboBox, les items du ComboBox sont des DataRowView. Comme à ce stade tu n'as pas encore défini le ValueMember, SelectedValue vaut la même chose que SelectedItem, c'est donc un DataRowView. Après que tu aies défini le ValueMember, SelectedValue sera bien de type String...

    Donc en fait il faudrait faire un test en plus dans le SelectedIndexChange :

    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
     Private Sub CB_Filiere_SelectedValueChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles CB_Filiere.SelectedValueChanged
            ' On vérifie que CB_Filiere.SelectedValue est de type String
            Dim selectedValue As String = TryCast(CB_Filiere.SelectedValue, String)
            If selectedValue IsNothing Then
                Return
            End If
     
            'Debloque le bouton d'accès au tableau si données existantes
            If selectedValue = "00" Then
                BtnNegoc.Enabled = False
            Else
                If Me.NegocDataSet.Tables("pcv").Select("Filiere='" & CB_Filiere.SelectedValue & "'").Length > 1 Then
                    BtnNegoc.Enabled = True
                Else
                    BtnNegoc.Enabled = False
                End If
            End If
        End Sub
    Ca fait un peu rustine, mais bon... ça devrait marcher

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

Discussions similaires

  1. Multi-selection dans une ComboBox ?
    Par Moloko dans le forum MFC
    Réponses: 5
    Dernier message: 07/07/2021, 17h26
  2. [Débutant] 2 combobox et SelectedValueChanged
    Par bechetbrice dans le forum VB.NET
    Réponses: 2
    Dernier message: 26/10/2014, 12h26
  3. [VB6] [Interface] ComboBox à plusieurs colonnes
    Par mtl dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 30/03/2004, 17h35
  4. combobox et readonly
    Par Mac leod dans le forum C++Builder
    Réponses: 6
    Dernier message: 28/11/2002, 10h27
  5. combobox->text
    Par clovis dans le forum C++Builder
    Réponses: 18
    Dernier message: 21/06/2002, 15h43

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