Label champs sql checkedlistchanged

Résolu
Signaler
Messages postés
24
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
15 juin 2010
-
Messages postés
24
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
15 juin 2010
-
Hey,

Voila je rencontre un petit soucis de codding sous vb.net 2k10.

Sous ma form j'ai inclus une checkedlistbox, ou j'y ai fait affiché un string particulier de ma bdd (exemple des strings: Id, Members, Country, Work) elle affiche donc le strings Members, jusque la tout va bien.
Ensuite je désire lorsque que je clique sur le nom d'un membres dans la checkedlistbox, faire apparaitre dans plusieurs label simultanément les autres strings correspond.
Ex: je clic sur toto, sa m'affiche dans le label1 "Montélimar" dans le label2 "Cuisinier", le tout récupérer via la bdd.

J'espère avoir été assez clair, après de nombreuse recherche je ne trouve pas vraiment ce que je souhaite.

Merci à vous

17 réponses

Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Autant pour moi c'est une erreur de ma part

J'ai oublié d'instancier la DataTable, remplace :

Dim dt As DataTable = Nothing


Par :

Dim dt As New DataTable


Comme je ne possède pas ta base et que je n'avais pas envie de la recréer, je n'ai pas pu tester le code.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Pourtant dans le code posté c'était bon ?

If Index <> -1 And Index < (dt.Rows.Count - 1) Then


Attention :

Index < (dt.Rows.Count - 0) = Index < dt.Rows.Count

Si ton Index dépasse ou est égale au nombre d'élément de ta liste à cause d'une différence de mise à jour de la table, cela provoquera une exception.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Salut,

Etant donné que le CheckedListBox n'est pas conçu pour travailler avec les données comme le ListBox classique, il va te faloir récupérer l'id du membre sélectionné et faire une requête SELECT avec une clause WHERE en passant celui-ci en référence, après avoir reçu le résultat, il ne te restera plus qu'a l'afficher dans tes labels.


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
24
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
15 juin 2010

Ok merci pour ta réponse, mais j'ai un peu de mal à visualisé le déroulement à effectuer, pourrais tu me donner un exemple avec du code svp ?
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Pas possible, je ne peux pas te donner un exemple de code pour l'accès aux données d'une table dont j'ignore tout !

Poste déjà le code qui te permet de remplir ta listbox, et fais un listing des champs que tu voudrais afficher avec leur nom exacte dans ta base, je verrais ce que je peux faire.

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
24
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
15 juin 2010

Ok autant pour moi, je vous fait sa de suite.

Mon Code de connexion et de listing dans ma CheckedBoxList:
'Les Imports
Imports MySql.Data.MySqlClient ' Require MySQL Connector .Net this is to import MySQL.NET (%windir%\assembly\GAC\MySql.Data\1.0.7.30072__c5687fc88969c44d\MySql.Data.dll)
Imports System.Data.SqlClient
'dans ma form

'les declaration
    Dim HostConn As New MySqlConnection
    Dim da As MySqlDataAdapter
    Dim dt As DataTable
    Dim ds As New DataSet
    Dim i As Integer
'puis dans mon form_load
        HostConn.ConnectionString = "server=myserver;" _
                             & "user id=myuser;" _
                             & "password=mypass;" _
                             & "database=mydatabase"

        Try
            HostConn.Open()
            da = New MySqlDataAdapter("SELECT * FROM MySqlTest", HostConn)
            da.Fill(ds, "MySqlTest")
            
            For Me.i = 0 To ds.Tables(0).Rows.Count - 1
                CheckedListBox1.Items.Add(ds.Tables(0).Rows(i)(1))
            Next i
        Catch myerror As MySqlException

            MsgBox("" & myerror.Message, MsgBoxStyle.Critical)
        End Try


Ma Sql de test:
CREATE TABLE IF NOT EXISTS `MySqlTest` (
  `SQLID` smallint(6) unsigned NOT NULL,
  `SQLName` tinytext COLLATE latin1_general_ci NOT NULL,
  `SQLMetier` text COLLATE latin1_general_ci NOT NULL,
  `SQLPays` text COLLATE latin1_general_ci NOT NULL,
  `SQLSiteWeb` text COLLATE latin1_general_ci NOT NULL,
  PRIMARY KEY (`SQLID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci;

INSERT INTO `MySqlTest` (`SQLID`, `SQLName`, `SQLMetier`, `SQLPays`, `SQLSiteWeb`) VALUES
(1, 'Eric', 'Cuisto', 'France', 'http://..'),
(2, 'Jean', 'Militaire', 'Espagne', 'http://..'),
(3, 'Paul', 'Vendeur', 'Etats Unis', 'http://..');


Dans ma CheckedListBox, j'ai fait s'afficher le nom des personnes, à la sélection d'un nom je cherche à afficher dans les label les infos complémentaires comme ceci:
Label1 => le métier (SQLMetier)
Label2 => Le pays (SQLPays)
Label3 => Le Site Web (SQLSiteWeb)

Voila j'espère que c'est assez complet.

Merci à vous ;)
Messages postés
10
Date d'inscription
mercredi 2 juin 2010
Statut
Membre
Dernière intervention
15 juin 2010

Voilà mon code modifier pour toi (normalement il va alléger ton code et tu pourrais meme le reprendre pour ta première partie, mais je sais pas si ça marche avec une CheckedListBox c'est à vérifier) :

Using conn As MySqlConnection = New MySqlConnection("server=myserver; uid=myuser;pwd=mypass;database=mydatabase;") 
Using cmd As MySqlCommand = New MySqlCommand("SELECT SQLMetier FROM MySqlTest where SQLName='" & CheckedListBox1.Text & "'", conn) 

conn.Open() 

Using reader As MySqlDataReader = cmd.ExecuteReader() 

While reader.Read() 
Label1.Text = reader("id") 
End While 

End Using 

End Using 
End Using 


Normalement ça devrait répondre à tes attentes, si c'est pas ce que tu cherche à faire ça veut dire que je n'ai rien compris à ton problème

ps: ce code marchera que sur la CheckedListBox1_SelectedText ou un truc du genre et sinon ce code permet just de récupérer le Métier dans le label1 pour le pays et le site il faut que tu refasse le code en changant la requete sql et le label

Cordialement.
Messages postés
10
Date d'inscription
mercredi 2 juin 2010
Statut
Membre
Dernière intervention
15 juin 2010

Oups je me suis trompé à un endroit j'ai mis :

label1.text = reader("id")

mais en faites il faut mettre :

label1.text = reader("SQLMetier")

Voilà et n'hésite pas à demander si ça ne marche toujours pas .
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
tomass87> Ce n'est pas une bonne idée, ta requête SELECT recherche l'utilisateur par son nom et non par son ID, ton code ne fonctionnera pas si dans la base il y a plusieurs utilisateurs portant le même nom.

De plus elle exécute une requête SQL à chaque changement sur la liste ce n'est pas très optimisé.

Comme je l'ai dis plus haut le plus simple serait d'utiliser une ListBox Classique qui possède les propriétés DatSource, DisplayMember et ValueMember, seul bémol, elle ne gère pas les checkbox.

Je pense que le plus simple serait de Garder la DataTable en mémoire (déclaré au sein du formulaire) et de se référer à l'index de la listbox sélectionner pour avoir la ligne correspondante dans cette DataTable.

Imports MySql.Data.MySqlClient
Imports System.Data.SqlClient
' 
Public Class Form1
    '
    Dim dt As DataTable = Nothing
    '
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        '
        Dim HostConn As New MySqlConnection("ta chaine de connexion")
        Try
            Dim da As New MySqlDataAdapter("SELECT * FROM MySqlTest", HostConn)
            HostConn.Open()
            da.Fill(dt)
            For Each Row As DataRow In dt.Rows
                CheckedListBox1.Items.Add(Row.Item("SQLName"))
            Next
        Catch myerror As MySqlException
            MsgBox(myerror.Message, MsgBoxStyle.Critical)
        Finally
            If HostConn.State <> ConnectionState.Closed Then
                HostConn.Close()
            End If
        End Try
        '
    End Sub
 
    Private Sub CheckedListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckedListBox1.SelectedIndexChanged
        '
        Dim Index As Integer = CheckedListBox1.SelectedIndex
        If Index <> -1 And Index < (dt.Rows.Count - 1) Then
            Label1.Text = dt.Rows(Index).Item("SQLMetier")
            Label2.Text = dt.Rows(Index).Item("SQLPays")
            Label3.Text = dt.Rows(Index).Item("SQLSiteWeb")
        End If
        '
    End Sub
    '
End Class


Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
24
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
15 juin 2010

Merci à vous deux de passer du temps sur mon soucis ;)

Thomas votre code fonctionne, avec quelques petit arrangements comme vous l'aviez stipuler, mais ce n'est pas exactement ce que je recherche.

Mayzz vous tapez en plein dans ce que je souhaite réaliser, cependant rien de s'affiche dans ma CheckedListBox avec votre code, il doit y avoir un truc qui m'échappe une bourde de ma part peut être ?

J'ai remarquer que Vous passiez directement via datatable alors que moi sur mon code de départ, j'étais obliger de passer via dataset pour afficher le contenu, cela vient peut être de la ?
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
Dim HostConn As New MySqlConnection("ta chaine de connexion")


As-tu remplacer ta chaine de connexion ?

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
24
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
15 juin 2010

Oui bien sur:
Dim HostConn As New MySqlConnection("server=localhost; uid=MyUser; pwd=MyPass; database=MyDatabase;")

J'ai essayer de mettre sa dans un bouton.click pour afficher l'erreur engendrer et j'obtiens ceci:

La valeur ne peut pas être null.
Nom du paramètre : dataTable
Messages postés
24
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
15 juin 2010

Super sa fonctionne, par contre le dernier "nom" qui apparait dans la checkedlistbox na aucune action est ce normal ?
Messages postés
24
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
15 juin 2010

Ok désolé, je vient de regarder et j'ai vu ceci:
If Index <> -0 And Index < (dt.Rows.Count - 0) Then

J'ai remplacer par:
If Index <> -1 And Index < (dt.Rows.Count - 0) Then

Tout fonctionne parfaitement, Merci beaucoup Mayzz t'es un chef ;)
Messages postés
24
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
15 juin 2010

Ok c'est noté, j'ai remplacer par ce que vous venez de notifier et sa fonctionne.

Sur le code posté:
If Index <> -1 And Index < (dt.Rows.Count - 1) Then

Le dernier choix de la liste n'avait aucune action c'est moi qui me suis planter ci dessus en écrivant
If Index <> -0 And Index < (dt.Rows.Count - 0) Then

sur le code c'etait bien argumenter comme cela
If Index <> -1 And Index < (dt.Rows.Count - 1) Then

Mais comme je l'ai dit le dernier choix dans la liste n'avait aucune action, j'ai donc remplacer par:
If Index <> -1 And Index < (dt.Rows.Count - 0) Then

pour que cela fonctionne.

Puis je vient de remplacer par le dernier code que vous avez notez et cela fonctionne.

Encore merci
Messages postés
2813
Date d'inscription
mardi 15 avril 2003
Statut
Membre
Dernière intervention
2 juin 2020
38
en effet, encore une erreur de ma part, c'est bien '< dt.Rows.Count'

et non -1 étant données que l'index commence à 0 et non à 1

Arf, pas évident sans tester !

Si le déboguage est l'art d'enlever les bogues, la programmation doit être l'art de les créer.
Messages postés
24
Date d'inscription
mercredi 10 septembre 2008
Statut
Membre
Dernière intervention
15 juin 2010

Aucun soucis, sa fonctionne c'est le principal, pour quelqu'un qui na pas tester c'etait même plutôt bon à vrai dire ;)