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 2005]Probleme avec une listbox et DBNull


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut [VB 2005]Probleme avec une listbox et DBNull
    Bonjour à tous,

    Tout d'abord je tiens à préciser que je suis débutant en vb, alors mon problème va peut être vous semblait bête...
    Avant d'exposer ce problème, je précise que je travaille sous visual studio 2005, et j'utilise une base de donnée sous Access.
    Alors mon problème est tout simple, je veux récupérer les donnée d'une table ayant pour condition le texte sélectionné dans ma listbox.
    Ma requête est donc la suivante :

    choix = ListBox1.Text
    sql = "select * from Personne where Nom='" & choix & "';"

    Il me semble que cela est correct vu que si je fais un messagebox.show(choix) il m'affiche bien le texte qui a été choisi dans la listbox, et si je fais un messagebox.show(sql), elle aussi semble correcte.

    Je précise que l'erreur que j'obtiens est : "La conversion du type 'DBNull' en type 'String' n'est pas valide. Mais ma requête ne retourne pas une valeur nulle."

    Enfin je débute et je n'ai certainement pas encore tout compris. Je précise que cette instruction est placé sur l'évenement clic dans la listbox. Je vous joins, le code sur cet évenement. Merci de me porter votre aide.

    Voici le code :
    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
    Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.Click
            Dim choix As String
            choix = ListBox1.Text
            cnxstr = "provider = microsoft.jet.oledb.4.0 ; data source = " & Application.StartupPath & "\Agenda.mdb;"
            cnx = New OleDbConnection
            cnx.ConnectionString = cnxstr
            cnx.Open()
            'Création de la requête sql
            sql = "select * FROM Personne where Nom='" & choix& "';"
            'Création de la commande et on l'instancie (sql)
            cmd = New OleDbCommand(sql)
            'Création du data-adapter (dta) et on l'instancie (cmd)
            dta = New OleDbDataAdapter(cmd)
            'On instancie la commande (cmd) à la connection (cnx)
            cmd.Connection() = cnx
            'On charge le dataset (dts) grace à la propriété fill du data-adapter (dta)
            dta.Fill(dts, "Personne")
            'On charge la datatable (dtt) grace à la propriété tables du dataset (dts)                 
            dtt = dts.Tables("Personne")
            Me.TextBox1.Text = dtt.Rows(0).Item("Nom")
            Me.TextBox2.Text = dtt.Rows(0).Item("Prenom")
            Me.TextBox3.Text = dtt.Rows(0).Item("DateNaissance")
        End Sub
    
    Merci de m'avoir porté un peu d'attention
    PS : Veuillez m'excuser si un poste de ce type existe déjâ je n'ai pas été fichu de le trouver

  2. #2
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 184
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 184
    Par défaut
    Bonjour.

    Tu ne nous as pas dit où tu avais l'erreur (sur quelle ligne) ?

    Ca doit être sur l'une des lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Me.TextBoxyyy.Text = dtt.Rows(0).Item("yyyyy")
    Tu devrais détecter le DBNull avant d'affecter la valeur au .Text.

    Un truc du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Me.TextBoxyyy.Text = CStr(IIf(IsDBNull(dtt.Rows(0).Item("yyyyy")), "", dtt.Rows(0).Item("yyyyy"))
    PS : Pense aux balises [code]

    Cdt.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    Merci d'avoir répondu aussi rapidement.

    Les erreurs sont aux lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Me.TextBox2.Text = dtt.Rows(0).Item("Prenom")
    Me.TextBox3.Text = dtt.Rows(0).Item("DateNaissance")

    Avec votre solution je n'ai plus d'erreur. Mais les champs ne se remplissent pas. JE ne comprend pas pourquoi ils sont nuls. Lorsque j'affiche le contenu de la variable "sql"


    et que je la teste sous mon sgbd access, il n'y a pas de champs nuls.


    Je ne comprends donc pas d'où vient ce problème...

    De plus maintenant lorsque je clic sur un élément de ma ListBox cet élément est recopié et collé à la fin. Je vais finir par abandonné ce formulaire

  4. #4
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 184
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 184
    Par défaut
    Bonjour.

    Je ne vois pas d'où peut venir le probléme.

    En mode debug, tu obtiens bien quelque chose dans dtt ?

    Cdt.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    J'ai complètement changé mon formulaire, je suis passé d'une listbox à un combobox mais j'ai un nouveau problème sur l'événement clic, les textbox associé ne se mettent pas à jour. Une idée du "pourquoi ?"

    Au chargement du formulaire (vive l'assistant Visual studio)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Private Sub Modif_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.PersonneTableAdapter.Fill(Me.AgendaDataSet.Personne)
            TextBox1.Enabled = False
            TextBox2.Enabled = False
            TextBox3.Enabled = False
        End Sub

    Pour l'affichage dans les textbox :
    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
     
    Private Sub ComboBox1_Clic(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.Click
            TextBox1.Enabled = True
            TextBox2.Enabled = True
            TextBox3.Enabled = True
            Dim choix As String
            choix = ComboBox1.Text
            MessageBox.Show(choix)
            ''ouverture de la connection(à partir du répertoire de l'application)sur la même ligne
            cnxstr = "provider = microsoft.jet.oledb.4.0 ; data source = " & Application.StartupPath & "\Agenda.mdb;"
            cnx = New OleDbConnection
            cnx.ConnectionString = cnxstr
            cnx.Open()
            ''Création de la requête sql
            sql = "select nom,prenom,datenaissance from Personne where nom ='" & choix & "';"
            ''Création de la commande et on l'instancie (sql) 
            cmd = New OleDbCommand(sql)
            ''Création du dataadapter (dta) et on l'instancie (cmd)
            dta = New OleDbDataAdapter(cmd)
            ''On instancie la commande (cmd) à la connection (cnx) 
            cmd.Connection() = cnx
            ''On charge le dataset (dts) grace à la propriété fill du dataadapter (dta)
            dta.Fill(dts, "Personne")
            ''On charge la datatable (dtt) grace à la propriété tables du dataset (dts)                  
            dtt = dts.Tables("Personne")
            ''Indiquer quelle colonne afficher
            'ListBox1.DataSource = dtt
            Me.TextBox1.Text = dtt.Rows(rownum).Item("Nom")
            Me.TextBox2.Text = dtt.Rows(rownum).Item("Prenom")
            Me.TextBox3.Text = dtt.Rows(rownum).Item("DateNaissance")
        End Sub
    Mais les textbox ici ne s'actualisent pas et je ne sais pas s'il faut travailler sur cet événement... Mais il y a du progrès !

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    J'ai réussi a trafiquer ma listbox et elle affiche correctement cependant j'ai un problème pour afficher les valeur dans les textbox associés. Enfin lorsque je clic sur le premier ou second élément lors du lancement du formulaire tout marche comme il faut, cependant si le formulaire se lance et que je clic sur un élément supérieur au second j'ai une erreur... Ce n'est pas tres clair je vous joins donc un screenshot



    Je suppose donc que c'est un problème d'index, j'ai pas du tout comprendre à comment ceci fonctionnaient ...

    Voici le code de ma listbox
    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
     
    Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.Click
            rownum = ListBox1.SelectedIndex
            TextBox1.Enabled = True
            TextBox2.Enabled = True
            TextBox3.Enabled = True
            Dim choix As String
            choix = ListBox1.Text
            ''ouverture de la connection(à partir du répertoire de l'application)sur la même ligne
            cnxstr = "provider = microsoft.jet.oledb.4.0 ; data source = " & Application.StartupPath & "\Agenda.mdb;"
            cnx = New OleDbConnection
            cnx.ConnectionString = cnxstr
            cnx.Open()
            ''Création de la requête sql
            sql = "select nom,prenom,datenaissance from Personne where nom ='" & choix & "';"
            ''Création de la commande et on l'instancie (sql)
            cmd = New OleDbCommand(sql)
            ''Création du dataadapter (dta) et on l'instancie (cmd)
            dta = New OleDbDataAdapter(cmd)
            ''On instancie la commande (cmd) à la connection (cnx)
            cmd.Connection() = cnx
            ''On charge le dataset (dts) grace à la propriété fill du dataadapter (dta)
            dta.Fill(dts, "Personne")
            ''On charge la datatable (dtt) grace à la propriété tables du dataset (dts)                 
            dtt = dts.Tables("Personne")
            ''Indiquer quelle colonne afficher
            Me.TextBox1.Text = dtt.Rows(rownum).Item("Nom")
            Me.TextBox2.Text = dtt.Rows(rownum).Item("Prenom")
            Me.TextBox3.Text = dtt.Rows(rownum).Item("DateNaissance")
        End Sub
    et celui du chargement du formulaire
    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
     
    Private Sub Modif_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Me.PersonneTableAdapter.Fill(Me.AgendaDataSet.Personne)
            Dim index As Integer
            index = 0
            ListBox1.SelectedIndex = index
            Dim choix As String
            choix = ListBox1.Text
            ''ouverture de la connection(à partir du répertoire de l'application)sur la même ligne
            cnxstr = "provider = microsoft.jet.oledb.4.0 ; data source = " & Application.StartupPath & "\Agenda.mdb;"
            cnx = New OleDbConnection
            cnx.ConnectionString = cnxstr
            cnx.Open()
            ''Création de la requête sql
            sql = "select nom,prenom,datenaissance from Personne where nom ='" & choix & "';"
            ''Création de la commande et on l'instancie (sql)
            cmd = New OleDbCommand(sql)
            ''Création du dataadapter (dta) et on l'instancie (cmd)
            dta = New OleDbDataAdapter(cmd)
            ''On instancie la commande (cmd) à la connection (cnx)
            cmd.Connection() = cnx
            ''On charge le dataset (dts) grace à la propriété fill du dataadapter (dta)
            dta.Fill(dts, "Personne")
            ''On charge la datatable (dtt) grace à la propriété tables du dataset (dts)                 
            dtt = dts.Tables("Personne")
            ''Indiquer quelle colonne afficher
            Me.TextBox1.Text = dtt.Rows(rownum).Item("Nom")
            Me.TextBox2.Text = dtt.Rows(rownum).Item("Prenom")
            Me.TextBox3.Text = dtt.Rows(rownum).Item("DateNaissance")
        End Sub

  7. #7
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 184
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 184
    Par défaut
    Bonjour.

    Tu prends le rownum = ListBox1.SelectedIndex pour rechercher dans la datatable que tu charges avec ton "select nom,prenom,datenaissance from Personne where nom ='" & choix & "';".

    C'est étrange non ? D'aprés ta requête, tu récupéres une seule ligne.

    Donc au lieu d'utiliser rownum, reviens à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Me.TextBox1.Text = dtt.Rows(0).Item("Nom")
    ...
    Cdt.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    en effet merci cela n'allé pas du tout.
    Le problème c'est que la les textbox ne s'actualise pas lorsqu'on clic
    lorsque je fais un dtt.rows(0) .... il m'affiche toujours le premier élement

  9. #9
    Membre Expert
    Avatar de olsimare
    Inscrit en
    Décembre 2006
    Messages
    1 184
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 184
    Par défaut
    Bonjour.

    Bon, question bête ...

    Tu as défini les valuemember et displaymember pour la listbox ?

    Je pense que ton probléme est en amont --> dans le datasource de la listbox.

    Comment tu alimentes cette listbox ?

    Cdt.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 15
    Par défaut
    Merci pour votre aide j'ai finalement employé une autre méthode qui fonctionne

    Chargement du formulaire
    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
     
    Private Sub Modif_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            strConn = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & Application.StartupPath & "\Agenda.mdb;"
            'Initialisation de la chaîne contenant l'instruction SQL
            strSql = "SELECT Personne.* FROM Personne"
            'Instanciation d'un Objet Connexion
            ObjetConnection = New OleDbConnection
            'Donner à la propriété ConnectionString les paramètres de connexion
            ObjetConnection.ConnectionString = strConn
            'Ouvrir la connexion
            ObjetConnection.Open()
            'Instancier un objet Commande
            ObjetCommand = New OleDbCommand(strSql)
            'Instancier un objet Adapter
            ObjetDataAdapter = New OleDbDataAdapter(ObjetCommand)
            'initialiser l'objet Command
            ObjetCommand.Connection() = ObjetConnection
            'Avec l'aide de la propriété Fill du DataAdapter charger le DataSet
            ObjetDataAdapter.Fill(ObjetDataSet, "Personne")
            'Mettre dans un Objet DataTable une table du DataSet
            ObjetDataTable = ObjetDataSet.Tables("Personne")
            If rownum > ObjetDataTable.Rows.Count - 1 Then
                MessageBox.Show("Aucune personne présente.")
                personne.Show()
                Me.Close()
                Exit Sub
            End If
            'Indiquer au ListBox d'afficher la table "fichepatient" (indiquer la source)
            ListBox1.DisplayMember = "NOM"
            ListBox1.DataSource = ObjetDataSet.Tables("Personne")
    End sub
    Code de la listbox
    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
     
     Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
            TextBox1.Enabled = True
            TextBox2.Enabled = True
            Me.MaskedTextBox1.Enabled = True
            Dim o As New Object
            ListBox1.ValueMember = "NOM"
            ListBox1.DataSource = ObjetDataSet.Tables("Personne")
            If ListBox1.SelectedIndex <> -1 Then
                TextBox1.Text = CType(ListBox1.SelectedValue, String)
            End If
            ListBox1.ValueMember = "PRENOM"
            ListBox1.DataSource = ObjetDataSet.Tables("Personne")
            If ListBox1.SelectedIndex <> -1 Then
                TextBox2.Text = CType(ListBox1.SelectedValue, String)
            End If
            ListBox1.ValueMember = "DATENAISSANCE"
            ListBox1.DataSource = ObjetDataSet.Tables("Personne")
            If ListBox1.SelectedIndex <> -1 Then
                MaskedTextBox1.Text = CType(ListBox1.SelectedValue, String)
            End If
        End Sub
    Désolé pour le temps de réponse, je n'avais pas pu vous répondre avant
    En tout cas merci. Cependant j'ai essayé d'améliorer cette application et j'ai un problème de mise à jour de listbox. Mais je vais créer un autre sujet pour ne pas tout mélanger.

    Merci à vous

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

Discussions similaires

  1. Probleme avec une ListPicker dans une listBox
    Par YohDono dans le forum Windows Phone
    Réponses: 8
    Dernier message: 02/03/2012, 10h30
  2. probleme avec une listbox
    Par patou60110 dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 09/04/2007, 19h38
  3. Probleme avec une ListBox
    Par beb30 dans le forum MFC
    Réponses: 3
    Dernier message: 02/06/2006, 11h08
  4. [debutant] Probleme avec une listBox.
    Par Mickey.jet dans le forum Delphi
    Réponses: 2
    Dernier message: 30/05/2006, 13h21
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 18h14

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