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 :

datagridview et selection d enregistrements


Sujet :

VB.NET

  1. #1
    Candidat au Club
    datagridview et selection d enregistrements
    mon problème :

    j ai une form sur laquelle je saisi un nom de responsable et je passe a ma form 2 sur laquelle il y a un datagridview
    qui m affiche les personnes rattachées a ce responsable. malheureusement la datagridview m'affiche TOUTES les personnes
    se trouvant dans le fichier (mdb), requete sql???? ou la placer??? ou autre ???
    qq un peux m'aider ???

    en VB 2012

    d'avance merci

  2. #2
    Membre chevronné
    Bonsoir,

    Je ne comprends pas ta question.
    La première requête donne les "Hotesse" et la seconde donne les "Clients" de l'hôtesse sélectionnée dans le premier jeu.
    N'est-ce pas cela que tu voulais ?
    Es-tu embêté parce que les "hotesse" qui existent plusieurs fois dans la DB (c'est le cas de la B et de la C) sont présentées plusieurs fois dans la 1ère requête ?

    ...


  3. #3
    Candidat au Club
    Bonsoir,

    je n'ai pas de première requête, sur la première form l'utilisateur saisi le nom de l’hôtesse et a la suite de quoi
    je souhaite afficher dans une deuxième form les personnes rattachés a cette hôtesse.

  4. #4
    Membre du Club
    Salut,

    Tu expliques
    Citation Envoyé par gouyette27420
    j ai une form sur laquelle je saisi un nom de responsable et je passe a ma form 2 sur laquelle il y a un datagridview
    qui m affiche les personnes rattachées a ce responsable. malheureusement la datagridview m'affiche TOUTES les personnes
    se trouvant dans le fichier (mdb), requete sql???? ou la placer??? ou autre ???
    C'est pas très clair, si au moins tu postais ton code, on pourrait peut-être mieux comprendre ...

    Cdt

    Sam

  5. #5
    Candidat au Club
    salut,

    pas clair??? je peux pas faire plus clair, 1 ere FORM1 on saisi un nom d'hotesse, on passe a la Form2 qui a une datagridview et
    dans cette datagridview je veux afficher que les clients rattachés a cette hotesse. tout bete dans le principe.
    Seul problème je n'arrive pas a sélectionner que les clients concernés.

  6. #6
    Membre chevronné
    @ Sam
    Vois la discussion SQL avec un datagridview en vb 2012 du 12/10. Tu comprendras mieux.

    @Gouyette
    Sam a raison, tu devrais poster ton code.
    En fait en créant une nouvelle discussion, tu perds (nous fait perdre) de l'information. J'ai pu intervenir facilement parce que je me souviens de la discussion précédente.
    Ce serait mieux d'enchaîner les messages dans la même discussion, cela informe tout nouvel intervenant et permet d'évoluer sans tout reprendre zéro ...

    Bref ...,

    Je te renvoie une vidéo qui semble mieux répondre à ta demande. Cette fois, la clé est saisie dans une TextBox (au lieu d'être choisie dans une liste) : https://www.dropbox.com/s/i9tq2tjm3sna5jv/AdminGouyette2.mp4?dl=0

    Le code modifié (ajouté) à mon code de l'autre jour est celui-ci (il utilise une TextBox et un Button ajouté sur le Form1) :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub BCherche_Click(sender As Object, e As EventArgs) Handles BCherche.Click
            Try
                AfficheDetailHotesse(TextBox1.Text)
            Catch
            End Try
        End Sub


    Quant à la procédure AfficheDetailHotesse de remplissage des DataGridView il n'a pas changé (et comme tu peux voir sur la vidéo, il ne donne que les clients de l'hôtesse encodée). Peux importe que les DataGridView soient sun un Form ou un autre, mon code est assez lisible sur ce point.

    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
    38
    39
    40
    41
     
      Private Sub AfficheDetailHotesse(HotesseCherchee As String)
     
            Try                                                      ' Pour tests multiples
                MesDatas.Tables.Remove("DetailHotesse")
                DataGridView1.DataSource = Nothing
                DataGridView1.Rows.Clear()
            Catch ex As Exception
            End Try
     
            Dim UneTable As New DataTable
            Dim PhraseSQL As String
     
            '' Si "Hotesse" nécessaire dans le résultat
            PhraseSQL = "SELECT Hotesse, Nom, Prénom, Adresse, CodePostal, Ville, telephone1 FROM contactlang WHERE Hotesse = '" & HotesseCherchee & "' ORDER BY Nom"
     
            '' Si "Hotesse" PAS nécessaire dans le résultat
            ' PhraseSQL = "SELECT Nom, Prénom, Adresse, CodePostal, Ville, telephone1 FROM contactlang WHERE Hotesse = '" & HotesseCherchee & "' ORDER BY Nom"
     
            MaConexion.ConnectionString = ChaineDeConnection
            Dim MonAdapter As OleDbDataAdapter = New OleDbDataAdapter(PhraseSQL, MaConexion)
     
            MonAdapter.Fill(UneTable)
            UneTable.TableName = "DetailHotesse"
            MesDatas.Tables.Add(UneTable)
     
            MonAdapter.Dispose()
     
            MaConexion.Close()
     
            DataGridView1.DataSource = MesDatas.Tables("DetailHotesse")
     
            ' Pour affichage dans Form2 :
            Try                                                      ' Pour tests multiples
                Form2.DataGridView1.DataSource = Nothing
                Form2.DataGridView1.Rows.Clear()
            Catch ex As Exception
            End Try
            Form2.DataGridView1.DataSource = MesDatas.Tables("DetailHotesse")
     
        End Sub


    Si ceci ne te dépanne pas, donnes-nous un exemple écrit du résultat attendu, par exemple quand on encode B pour l'hôtesse.


  7. #7
    Candidat au Club
    merci , je regarde et désolé pour la perte de temps

  8. #8
    Candidat au Club
    j'ai regardé le code que tu m'as indiqué, impeccable, marche 1 fois, après le datagrid reste vide.
    je te joint 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    Public Class Form2
     
     
        Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Dim MaConexion As New OleDbConnection
            Dim MesDatas As New DataSet
            Dim MaComande As New OleDbCommand
            Dim ChaineDeConnection As String = "Provider=microsoft.jet.oledb.4.0 ; data source = " & Application.StartupPath & "\contactslang.mdb;"
     
            Try                                                      ' Pour tests multiples
                MesDatas.Tables.Remove("DetailHotesse")
                DataGridView1.DataSource = Nothing
                DataGridView1.Rows.Clear()
            Catch ex As Exception
     
            End Try
     
            Dim UneTable As New DataTable
            Dim PhraseSQL As String
     
            PhraseSQL = "SELECT * FROM contactlang WHERE Hotesse = '" & Form1.hotesse.Text & "' ORDER BY Nom"
     
            MaConexion.ConnectionString = ChaineDeConnection
     
            Dim MonAdapter As OleDbDataAdapter = New OleDbDataAdapter(PhraseSQL, MaConexion)
     
            MonAdapter.Fill(UneTable)
            UneTable.TableName = "DetailHotesse"
            MesDatas.Tables.Add(UneTable)
     
            MonAdapter.Dispose()
            MaConexion.Close()
     
            DataGridView1.DataSource = MesDatas.Tables("DetailHotesse")
     
            Timer1.Interval = 1000    'Timer1_Tick sera déclenché toutes les secondes.
            Timer1.Start()            'On démarre le Timer  
     
            Label3.Text = Now.ToString()
            Label1.Text = Format(Now, "hh:mm:ss")
     
        End Sub

  9. #9
    Membre chevronné
    Bien sûr ...

    Tu as travaillé à partir de mon code, mais tu l'as placé dans le deuxième Form.
    Dans mon code, tout le traitement se fait dans Form1. C'est dans la procédure AfficheDetailHotesse(HotesseCherchee As String) que je remplis les 2 DataGridView.
    Puisque tu as seulement le DataGridView du Form2, il te suffit de retire de mon code ce qui concerne l'autre DGV.

    Comme ceci :

    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
    38
    39
    40
    41
     
      Private Sub AfficheDetailHotesse(HotesseCherchee As String)
     
            Try                                                      ' Pour tests multiples
                MesDatas.Tables.Remove("DetailHotesse")
         ' ''''  Je supprime cette ligne :              DataGridView1.DataSource = Nothing
         ' ''''  Je supprime cette ligne :             DataGridView1.Rows.Clear()
            Catch ex As Exception
            End Try
     
            Dim UneTable As New DataTable
            Dim PhraseSQL As String
     
            '' Si "Hotesse" nécessaire dans le résultat
            PhraseSQL = "SELECT Hotesse, Nom, Prénom, Adresse, CodePostal, Ville, telephone1 FROM contactlang WHERE Hotesse = '" & HotesseCherchee & "' ORDER BY Nom"
     
            '' Si "Hotesse" PAS nécessaire dans le résultat
            ' PhraseSQL = "SELECT Nom, Prénom, Adresse, CodePostal, Ville, telephone1 FROM contactlang WHERE Hotesse = '" & HotesseCherchee & "' ORDER BY Nom"
     
            MaConexion.ConnectionString = ChaineDeConnection
            Dim MonAdapter As OleDbDataAdapter = New OleDbDataAdapter(PhraseSQL, MaConexion)
     
            MonAdapter.Fill(UneTable)
            UneTable.TableName = "DetailHotesse"
            MesDatas.Tables.Add(UneTable)
     
            MonAdapter.Dispose()
     
            MaConexion.Close()
     
       ' ''''  Je supprime cette ligne :     DataGridView1.DataSource = MesDatas.Tables("DetailHotesse")
     
            ' Pour affichage dans Form2 :
            Try                                                      ' Pour tests multiples
                Form2.DataGridView1.DataSource = Nothing
                Form2.DataGridView1.Rows.Clear()
            Catch ex As Exception
            End Try
            Form2.DataGridView1.DataSource = MesDatas.Tables("DetailHotesse")
     
        End Sub


    Dans mon code, l'appel cette procédure quand on clique le bouton après avoir encodé la clé dans la TextBox1.
    Cela doit rester ainsi, il faut bien que le code "sache" quand il doit rechercher des "Clients" et les afficher, c'est-à-dire quand on clique, après avoir encodé une clé.

    Mon Form2 ne contient aucun code (tu peux le vérifier, je t'ai envoyé tout le projet l'autre jour).
    Sur Form1, j'ai placé un bouton pour demander l'affichage de Form2. Tu peux décider de l'afficher dès l'ouverture de Form1, un simple Form2.Show suffit.

    Dis-moi si tu peux résoudre cela. Si ça ne va pas, j'espère avoir un peu de temps demain matin pour faire une maquette conforme à mes explications.

    Bonne nuit,


  10. #10
    Membre chevronné
    Bonjour,

    Tant mieux si tu as résolu le problème entre temps, mais comme j’ai un peu de temps maintenant, j’ai fait le test selon mes explications d’hier.

    J’ai 2 Forms : Form1 et Form2.

    Sur Form2, le DataGridView1 et aucun code. L'affichage de Form2 est demandé dès l'ouverture de Form1.

    Sur Form1, TextBox1 et Button1 (TextBox1 pour l’encodage de la clé et Button1 pour commander l’affichage dans Form2.DataGridView1).

    Voici le code complet de Form1 :

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    Imports System.Data.OleDb
    Public Class Form1
     
        Dim MaConexion As New OleDbConnection
        Dim MesDatas As New DataSet
        Dim NomTablaEnDB As String
        Dim MaComande As New OleDbCommand
     
        Dim NomEtCheminDB As String = "D:\Tmp\AdminGouyette\contactslang.mdb" ' A changer selon le PC
        Dim ChaineDeConnection As String = "Provider=Microsoft.JET.OLEDB.4.0;Data Source=" & NomEtCheminDB & ";"  ' Exécuter en x86
     
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Form2.Show()
        End Sub
     
        Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles Me.FormClosed
            MaConexion.Dispose()
            MesDatas.Dispose()
            MaComande.Dispose()
        End Sub
     
        Private Sub AfficheDetailHotesse(HotesseCherchee As String)
     
            Try                                                 
                MesDatas.Tables.Remove("DetailHotesse")
            Catch ex As Exception
            End Try
     
            Dim UneTable As New DataTable
            Dim PhraseSQL As String
     
            '' Si "Hotesse" nécessaire dans le résultat
            PhraseSQL = "SELECT Hotesse, Nom, Prénom, Adresse, CodePostal, Ville, telephone1 FROM contactlang WHERE Hotesse = '" & HotesseCherchee & "' ORDER BY Nom"
     
            '' Si "Hotesse" PAS nécessaire dans le résultat
            ' PhraseSQL = "SELECT Nom, Prénom, Adresse, CodePostal, Ville, telephone1 FROM contactlang WHERE Hotesse = '" & HotesseCherchee & "' ORDER BY Nom"
     
            MaConexion.ConnectionString = ChaineDeConnection
            Dim MonAdapter As OleDbDataAdapter = New OleDbDataAdapter(PhraseSQL, MaConexion)
     
            MonAdapter.Fill(UneTable)
            UneTable.TableName = "DetailHotesse"
            MesDatas.Tables.Add(UneTable)
     
            MonAdapter.Dispose()
     
            MaConexion.Close()
     
           Try                                                      
                Form2.DataGridView1.DataSource = Nothing
                Form2.DataGridView1.Rows.Clear()
            Catch ex As Exception
            End Try
            Form2.DataGridView1.DataSource = MesDatas.Tables("DetailHotesse")
     
        End Sub
     
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Try
                AfficheDetailHotesse(TextBox1.Text)
            Catch
            End Try
        End Sub
    End Class


    Je n'ai pas programmer de Timer comme dans le code que tu as envoyé hier parce que je ne sais pas à quoi il sert, je ne sais pas non plus s'il doit être activé à partir de Form1 ou à partir de Form2. J'y reviendrai si tu me donnes davantage d'infos à son sujet.

    Très bonne journée,


  11. #11
    Candidat au Club
    Bonjour,
    marche nickel, j'ai appliqué le chargement dans le form1, super
    je vais m'attaquer a la modif, création et suppression d'enregistrement dans la datagrid avec maj de la mdb.
    je me permettrais de te redemander de l'aide si besoin!!!!
    et merci encore,
    Cordialement
    Jean claude

  12. #12
    Membre chevronné
    Bravo !

    Attention, avec la méthode de l'encodage dans un TextBox, s'il y a une erreur de frappe, les enregistrements ne sont pas trouvés.
    C'est pour cette raison que dans ma première version, je présentais toutes les clés dans une ListBox pour que l'utilisateur choisie celle qu'il veut au lieu de la taper au clavier.
    Peut-être as-tu là matière à réflexion...

    Bon codage pour la suite

  13. #13
    Candidat au Club
    Bonjour Phil,
    j'ai travaillé sur mon appli, je pensais bien avancer et c'est la cata
    je veux faire un ajout dans ma mdb, mais rien ne se passe et je n'ai aucun message d'erreur.....
    je te communique mon code, si tu peux y jeter un œil,

    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
     Dim ChaineDeConnection As String = "Provider=microsoft.jet.oledb.4.0 ; data source = " & Application.StartupPath & "\contactslang.mdb;"
     
            MaConexion.ConnectionString = ChaineDeConnection
     
            MaConexion.Open()
     
            Dim cmdText As String = "INSERT INTO contactlang (hotesse, nom)  VALUES (?,?)"
            Dim cmd As OleDbCommand = New OleDbCommand(cmdText, MaConexion)
     
            cmd.CommandType = CommandType.Text
            With cmd.Parameters
                .Add("@p1", OleDbType.VarChar).Value = Me.hotesse.Text
                .Add("@p2", OleDbType.VarChar).Value = Me.TextBox1.Text
     
                cmd.ExecuteNonQuery()
     
                MaConexion.Close()
     
                Me.Hide()

  14. #14
    Membre chevronné
    Bonsoir,
    Je ne suis pas sûr de la syntaxe mais je ne peux vérifier ce soir, je le ferai demain.
    Mais tu peux vérifier 2 choses.
    Ne faut-il pas remplacer les points d'interrogation par p1 et p2, ou @p1 et @p2.
    Quel est ce composant nommé hotesse : Me.hotesse.Text ?
    Je testerai demain dans la matinée.
    Bonne soirée

  15. #15
    Candidat au Club
    ok,

    pour les "?", tu as raison, regarde à

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    Add("@p1", OleDbType.VarChar).Value = Me.hotesse.Text
    Add("@p2", OleDbType.VarChar).Value = Me.TextBox1.Text


    il y a @p1 et p2

    pour le composant : Me.hotesse.Text, c'est une textbox qui se nomme : hotesse

  16. #16
    Membre chevronné
    Pour les ? ce que montre est bien juste mais faut essayer de les remplacer dans la phrase INSERT ...

  17. #17
    Candidat au Club
    j essaie demain matin,
    merci

  18. #18
    Membre chevronné
    Bonjour,

    Je te confirme que, dans cet usage des paramètres, il faut rempalcer les ? par les variables.
    En outre, j'utilise une autre syntaxe d'ajout des paramètres (qui me dispense d'indiquer les types) mais cela ne signifie pas que celle que tu as utilisée ne fonctionne pas. A tester.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ' ... ... ...
            Dim cmdText As String = "INSERT INTO contactlang (hotesse, nom)  VALUES (@p1, @p2)"
            Dim cmd As OleDbCommand = New OleDbCommand(cmdText, MaConexion)
     
            cmd.CommandType = CommandType.Text
            With cmd.Parameters
           '     .Add("@p1", OleDbType.VarChar).Value = Me.hotesse.Text
           '     .Add("@p2", OleDbType.VarChar).Value = Me.TextBox1.Text
          .AddWithValue("@p1", Me.hotesse.Text)
          .AddWithValue("@p2", Me.TextBox1.Text)
     
           cmd.ExecuteNonQuery()
     ' ... ... ...


    Si je peux me permettre ... ... je te suggère de commencer les noms des composants que tu déposes sur les Forms par quelques lettres indiquant leur type.

    Par exemple, T ou TB pour une TextBox, LB pour une ListBox, CB pour un ComboBox, DG pour un DataGridView, ... Microsoft préconise une nomenclature plus compliquée, elle est bien aussi.
    Si ton TextBox "hotesse" avait été nommé THotesse ou TBHotesse, je ne t'aurais pas demandé ce qu'était ce "hotesse".
    Dans la même logique (lisiblité du code), la TextBox1 serait mieux nommée TBNom.

    J'espère que tes INSERT fonctionneront avec le code ci-dessus ...


  19. #19
    Candidat au Club
    Bonjour,

    Merci pour ces recommandations, je vais les mettre en applications.
    Concernant la modification des p1 et p2, cela n'as rien changé.

    je vais continuer de chercher.
    Merci pour ton aide
    jc

  20. #20
    Membre chevronné
    P1 et P2 : c'est pourtant bien le début de la solution...
    Peux-tu me renvoyer ton code actuel ? J'aurai peut-être un peu de temps cet après-midi.

###raw>template_hook.ano_emploi###