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

VB.NET Discussion :

Problème avec ValueMember


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Problème avec ValueMember
    Bonjour,

    Je n'arrive pas à avoir la valeur du selectedvalue de ma listdevis

    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
     
     str = listclient.SelectedValue
            listdevis.Items.Clear()
     
            Try
                connexion_devis()
                sql = "Select Nom,Id From Devis Where idClient Like  '" & str & "'"
     
                Dim requete As New OleDbCommand(sql, cnx)
     
                reader = requete.ExecuteReader()
     
                Do While reader.Read()
                    listdevis.Items.Add(reader("Nom"))
                    listdevis.ValueMember = reader("Id")
                Loop
     
                reader.Close()
     
            Catch ex As Exception
                MessageBox.Show("Impossible d'établir la connection à la base." & ex.Message)
            End Try
            Try
                cnx.Close()
            Catch ex As Exception
                MessageBox.Show("Impossible d'établir la connection à la base." & ex.Message)
            End Try
    MsgBox(listdevis.SelectedValue)
    Help please.

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Dans ton code :
    Citation Envoyé par deviljim Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    listdevis.Items.Clear()
     ...
    MsgBox(listdevis.SelectedValue)
    Vider la liste puis tenter de lire la valeur sélectionnée, aïe ...

  3. #3
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Quel est le type de listdevis ?
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par ebastien Voir le message
    Bonjour,
    Dans ton code :


    Vider la liste puis tenter de lire la valeur sélectionnée, aïe ...
    Oui la liste ne sera vidée que si on ré-clique sur la listclient, c'est pour ne pas me retrouver avec les mêmes devis quand je change de client...
    En plus en testant sans effacé la listdevis j'ai toujours pas de valeur...

    Citation Envoyé par mactwist69 Voir le message
    Quel est le type de listdevis ?
    C'est un listbox, les 2 sont des listboxs, je rempli listdevis en cliquant sur la listclient, c'est 2 tables liée dans une base.

  5. #5
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Il semble que tu as deux colonnes : Id et Nom.
    Or les propriétés ValuMember et DisplayMember servent à définir quelle colonne est affichée et quelle laquelle possède une valeur cachée.

    Donc ça, c'est faux: listdevis.ValueMember = reader("Id")

    Ça devrait plutôt être un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    listdevis.ValueMember = ("Id")
    listdevis.DisplayMember = ("Nom")
     
    listdevis.Add(reader("id"),reader("nom"))
    Je suis pas sur de l'exacte manière de faire... :
    http://msdn.microsoft.com/en-us/libr...v=vs.110).aspx
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Mon code accuel fonctionne, le souci c'est qu'une fois la listdevis est remplie j'ai pas de valeur dans le selectedvalue or j'ai besoin l'id du devis sélectionné

    en faisant ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    listdevis.ValueMember = ("Id")
    listdevis.DisplayMember = ("Nom")
     
    listdevis.Add(reader("id"),reader("nom"))
    ma liste est remplie par id et nom et toujours pas de valeur ddans le selectedvalue

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Bonjour,

    Lorsque tu remplis ta liste devis, il n'y a plus de valeur sélectionnée, c'est ce que t'indique ebastien, il faut de nouveau sélectionner une valeur avant de pouvoir l'afficher avec MsgBox(listdevis.SelectedValue). Pour info, tu devrais utiliser messagebox.show.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  8. #8
    Membre émérite Avatar de mactwist69
    Homme Profil pro
    Développement VB.NET
    Inscrit en
    Janvier 2007
    Messages
    1 707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développement VB.NET
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 707
    Points : 2 528
    Points
    2 528
    Par défaut
    Exactement, soit l'utilisateur clique et il y a quelque chose dans selectValue...
    Soit tu fais un select dans le code...
    Soit tu affiches arbitrairement un élément de la liste... (sans utiliser selectedValue du coup)
    L'avenir appartient à ceux... dont les ouvriers se lèvent tôt. (Coluche)

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Je vous remercie de m'avoir répondu.
    Citation Envoyé par rv26t Voir le message
    Bonjour,

    Lorsque tu remplis ta liste devis, il n'y a plus de valeur sélectionnée, c'est ce que t'indique ebastien, il faut de nouveau sélectionner une valeur avant de pouvoir l'afficher avec MsgBox(listdevis.SelectedValue). Pour info, tu devrais utiliser messagebox.show.
    J'ai pas été très clair je l'admets.
    Au fait j'ai pas vraiment besoin de l'affichage, c'est juste pour savoir quelle est la valeur de mon listdevis.selectedvalue pour l'utiliser après.
    Et MsgBox(listdevis.SelectedValue) c'est pas dans l’événement listclient.SelectedIndexChanged mais dans listdevis.SelectedIndexChanged

    J'ai besoin de id du devis sélectionné pour pouvoir afficher une synthèse.



    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
    35
    36
    37
     Private Sub listclient_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles listclient.SelectedIndexChanged
            Dim str As Integer
            Dim sql As String
            Dim reader As OleDbDataReader
     
            str = listclient.SelectedValue
            listdevis.Items.Clear()
     
            Try
                connexion_devis()
                sql = "Select Nom,Id From Devis Where idClient Like  '" & str & "'"
     
                Dim requete As New OleDbCommand(sql, cnx)
     
                reader = requete.ExecuteReader()
     
                Do While reader.Read()
                    listdevis.Items.Add(reader("Nom"))
                    listdevis.ValueMember = reader("Id")
                Loop
     
                reader.Close()
     
            Catch ex As Exception
                MessageBox.Show("Impossible d'établir la connection à la base." & ex.Message)
            End Try
            Try
                cnx.Close()
            Catch ex As Exception
                MessageBox.Show("Impossible d'établir la connection à la base." & ex.Message)
            End Try
     
            Button3.Enabled = True
     
            Width = 700
     
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     Private Sub lstdevis_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles listdevis.SelectedIndexChanged
     
     
     
            MsgBox(listdevis.SelectedValue)
            Width = 963
        End Sub
    J'espère que vous m'avez mieux compris cette fois ci

  10. #10
    Modérateur

    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 722
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 722
    Points : 5 100
    Points
    5 100
    Par défaut
    Pour l'utiliser ainsi, il te faut une source de données.

    Crée une classe devis
    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
    Public Class Devis
        Private _Id As Integer
        Public Property Id() As Integer
            Get
                Return _Id
            End Get
            Set(ByVal value As Integer)
                _Id = value
            End Set
        End Property
        Private _Nom As String
        Public Property Nom() As String
            Get
                Return _Nom
            End Get
            Set(ByVal value As String)
                _Nom = value
            End Set
        End Property
        Sub New()
        End Sub
        Sub New(ByVal unId As Integer, ByVal unNom As String)
            Id = unId
            Nom = unNom
        End Sub
        Overrides Function ToString() As String
            Return Nom
        End Function
    End Class
    Tu crée une liste typée de devis.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        Private colDevis As List(Of Devis) = New List(Of Devis)
    Tu définis la source de données, la valeur d'affichage, la valeur réelle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            'DisplayMember sera affiché, ValueMember contiendra l'Id. 
            lstDevis.DisplayMember = "Nom"
            lstDevis.ValueMember = "Id"
            lstDevis.DataSource = colDevis
    Tu alimentes ta liste typé de devis (ca doit ressembler à cela)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        If reader.HasRows Then
            Do While reader.Read()
                  colDevis.Add(New Devis(reader("Id"), reader("Nom")))
            Loop
    Ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Sub listDevis_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles lstDevis.SelectedIndexChanged
            MessageBox.Show(lstDevis.SelectedValue)
        End Sub
    te donnera l'ID.

    Remarque : il faut utiliser les requêtes paramétrées. Voir Tuto ou Faq.
    Traductions d'articles :
    La mémoire en .NET - Qu'est-ce qui va où ?
    Architecture DAL de haute performance et DTO ; Version C# : Partie 1,Partie 2,Partie 3 — Version VB.NET : Partie 1,Partie 2,Partie 3
    N'hésitez pas à consulter la FAQ VB.NET, le cours complet de Philippe Lasserre et tous les cours, articles et tutoriels.

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Oui effectivement le souci était niveau du datasource.
    Une autre façon de procéder :
    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
     Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles listclient.SelectedIndexChanged
            Dim str As Integer
     
     
            str = listclient.SelectedValue
            'listdevis.Items.Clear()
     
            Try
                connexion_devis()
                Dim sdaa As New OleDbDataAdapter("Select Nom,Id From Devis Where idClient Like  '" & str & "'", cnx)
                Dim dta As New DataTable()
                sdaa.Fill(dta)
                listdevis.DataSource = dta
                listdevis.DisplayMember = "Nom"
                listdevis.ValueMember = "Id"
            Catch ex As Exception
                MessageBox.Show("Impossible d'établir la connection à la base." & ex.Message)
            End Try
            Try
                cnx.Close()
            Catch ex As Exception
                MessageBox.Show("Impossible d'établir la connection à la base." & ex.Message)
            End Try
     
            Button3.Enabled = True
     
            Width = 725
     
        End Sub
    ça marche aussi !
    Merci à toi.

  12. #12
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Oui cela est encore plus simple ainsi mais il est important de prendre en compte la remarque de rv26t :

    Citation Envoyé par rv26t Voir le message
    Remarque : il faut utiliser les requêtes paramétrées. Voir Tuto ou Faq.
    Cela correspond avec ton code à quelque chose comme :
    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
         Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles listclient.SelectedIndexChanged
            Dim str As Integer
     
            str = listclient.SelectedValue
            'listdevis.Items.Clear()
     
            Try
                connexion_devis()
                Dim dta As New DataTable()
                Using Cmd As New OleDbCommand("Select Nom,Id From Devis Where idClient Like ? ", cnx)
                    Cmd.Parameters.Add("idClient", OleDbType.VarChar).Value = str
                    Using sdaa As New OleDbDataAdapter(Cmd)
     
                        sdaa.Fill(dta)
                    End Using
                End Using
                listdevis.DataSource = dta
                listdevis.DisplayMember = "Nom"
                listdevis.ValueMember = "Id"
            Catch ex As Exception
                MessageBox.Show("Impossible d'établir la connection à la base." & ex.Message)
            End Try
            Try
                cnx.Close()
            Catch ex As Exception
                MessageBox.Show("Impossible d'établir la connection à la base." & ex.Message)
            End Try
     
            Button3.Enabled = True
     
            Width = 725
     
        End Sub

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Ok bien reçu ! Merci!
    Les requêtes paramétrées c'est par souci de sécurité non? Ou il y a d'autres avantages?

    Encore 2 questions si vous le permettez
    Souvent quand tu remplis une listbox ou combobox avec une datasource, quand tu veux faire des opération ça te dis "impossible de modifier quand la datasource est définie c'est pour cela que je préfère remplir mes listes par un reader. Auriez vous une astuce pour contourner ce problème?

    Quant-on fait un ajout ou une suppression dans une liste liée à bindingsource comment faire pour que la mise à jour soit effective automatiquement dans la liste, autrement dit comment faire pour que l'élément ajouté soit visible dans liste sans redémarrer l'appli ?

  14. #14
    Modérateur
    Avatar de Sankasssss
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 842
    Points : 4 232
    Points
    4 232
    Par défaut
    Citation Envoyé par deviljim Voir le message
    Les requêtes paramétrées c'est par souci de sécurité non? Ou il y a d'autres avantages?
    Principalement la sécurité mais aussi la simplification d'utilisation.
    En effet, tu n'a plus besoin de "mettre en forme" ta requête, j'entends par là que si tu mets un string, le système met automatiquement les quotes. Quand tu mets une date, tu peux lui passer un dateTime directement sans te soucier du format d'entrée de la BD.
    C'est aussi beaucoup plus lisible quand il n'y a pas de multiples concaténations.
    Ça évite bien des problèmes...

    Citation Envoyé par deviljim Voir le message
    Souvent quand tu remplis une listbox ou combobox avec une datasource, quand tu veux faire des opération ça te dis "impossible de modifier quand la datasource est définie c'est pour cela que je préfère remplir mes listes par un reader. Auriez vous une astuce pour contourner ce problème?
    Une fois la liste liée par dataSource, il faut modifier le dataSource d'entrée et non les items de la listbox.
    Si tu veux ajouter un item au listbox qui est lié à un datatable, il faut ajouter un datarow à la datatable. Si c'est une collection, il faut ajouter un élément à cette collection.

    Citation Envoyé par deviljim Voir le message
    Quant-on fait un ajout ou une suppression dans une liste liée à bindingsource comment faire pour que la mise à jour soit effective automatiquement dans la liste, autrement dit comment faire pour que l'élément ajouté soit visible dans liste sans redémarrer l'appli ?
    Comme précédemment, si tu ajoutes une dataRow à la dataTable liée au listBox, il s'affiche directement dans les éléments de la listBox. Mais il faut agir directement sur la collection liée au bindingsource.

    Un point fort de se principe est l'utilisation de dataView que l'on peut filtrer à la volée.
    Un petit exemple avec deux boutons nommé ButtonAjout, ButtonFiltre et un dataGridView nommé DataGridView1, code à copier dans un nouveau projet :
    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
    Public Class Form1
     
        Dim vue As DataView
        Dim dt As DataTable
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            dt = New DataTable
            dt.Columns.Add("nom")
            dt.Columns.Add("prenom")
            dt.Rows.Add(New String() {"Wauthy", "gaëtan"})
            dt.Rows.Add(New String() {"Tarantino", "Quentin"})
            dt.Rows.Add(New String() {"James", "Richard David"})
            vue = New DataView(dt)
            DataGridView1.DataSource = vue
        End Sub
     
        Private Sub ButtonAjout_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonAjout.Click
            dt.Rows.Add(New String() {"Funk", "Aaron"})
        End Sub
     
        Private Sub ButtonFiltre_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonFiltre.Click
            vue.RowFilter = "prenom like '%Da%'"
        End Sub
    End Class
    On voit que le nouvel élément s'ajoute sans problème.

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Super! merci pour ces précieux tuyaux.

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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