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 :

Comment filtrer les lignes d'un datagridview à partir d'une textbox?


Sujet :

VB.NET

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut Comment filtrer les lignes d'un datagridview à partir d'une textbox?
    Bonjour,

    Actuellement, j'ai un DataGridView (DGV) qui m'affiche sans difficulté le contenu d'une table de ma Base de données.
    J'arrive également à filtrer les résultats de ce DGV lorsque je tape un série de caractères dans une textbox de la manière suivante :

    Si je tape "D", Alors le DGV ne m'affiche que les lignes commençant par "D"
    Si je tape "Di", Alors le DGV ne m'affiche que les lignes commençant par "Di"

    Maintenant, si je cherche à n'afficher que les lignes contenant "SSD", je suis obligé de taper "Disque dur SSD"

    En fait le filtre s'attaque à la première lettre et fait son tri.

    Ce que je cherche à faire, c'est l'équivalent d'un LIKE *...* en SQL.

    C'est à dire que mon DGV m'affiche les lignes contenant "ma chaine de caractères" et peu importe l'ordre.

    Si quelqu'un pouvait m'éclairer, ce serait super parce que je cherche depuis très longtemps, je passe des nuits blanches à faire toutes sortes d'essais.. et c'est un échec à chaque fois..

    Voici mon code actuel =

    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
     
        Public Sub affichage_dgv_obs()
            dgv_art_obs.Rows.Clear()
     
            'Instancier un objet Commande
            Obj_Command = New OleDbCommand()
            'initialiser l'objet Command
            Obj_Command.Connection = laConnection
            Obj_Command.CommandText = "SELECT TYPE_ART_ID,TYPE_REF_FOURN,TYPE_REF_CONST,TYPE_ART_LIB,TYPE_ART_PV_HT,TYPE_ART_ECO_PART,TAXE_TAUX,TYPE_ART_PV_TTC,TYPE_ART_PA,TYPE_ART_QTE FROM TYPE_ARTICLE,TAXE WHERE TYPE_ARTICLE.TAXE_ID=TAXE.TAXE_ID AND TYPE_ART_TYP='Obsolète' AND (TYPE_REF_FOURN LIKE '" + Replace(tbx_art_rec_obs_ref.Text, "'", "''") + "%' OR TYPE_REF_FOURN IS NULL) AND (TYPE_REF_CONST LIKE '" + Replace(tbx_art_rec_obs_rec.Text, "'", "''") + "%' OR TYPE_REF_CONST IS NULL) AND (TYPE_ART_LIB LIKE '" + Replace(tbx_art_rec_obs_design.Text, "'", "''") + "%' OR TYPE_ART_LIB IS NULL) AND (TYPE_ART_PV_HT LIKE '" + Replace(tbx_art_rec_obs_ht.Text, "'", "''") + "%' OR TYPE_ART_PV_HT IS NULL) AND (TYPE_ART_ECO_PART LIKE '" + Replace(tbx_art_rec_obs_ecopart.Text, "'", "''") + "%' OR TYPE_ART_ECO_PART IS NULL) AND (TAXE_TAUX LIKE '" + Replace(tbx_art_rec_obs_tva.Text, "'", "''") + "%' OR TAXE_TAUX IS NULL) AND (TYPE_ART_PV_TTC LIKE '" + Replace(tbx_art_rec_obs_ttc.Text, "'", "''") + "%' OR TYPE_ART_PV_TTC IS NULL) AND (TYPE_ART_QTE LIKE '" + Replace(tbx_art_rec_obs_qte.Text, "'", "''") + "%' OR TYPE_ART_QTE IS NULL)"
     
            Obj_Reader = Obj_Command.ExecuteReader()
            While Obj_Reader.Read()
                dgv_art_obs.Rows.Add(Obj_Reader.GetValue(0).ToString(), Obj_Reader.GetValue(1).ToString(), Obj_Reader.GetValue(2).ToString(), Obj_Reader.GetValue(3).ToString(), toMoney(Obj_Reader.GetValue(4).ToString()), toMoney(Obj_Reader.GetValue(5).ToString()), toPercent(Obj_Reader.GetValue(6).ToString()), toMoney(Obj_Reader.GetValue(7).ToString()), toMoney(Obj_Reader.GetValue(8).ToString()), Obj_Reader.GetValue(9).ToString())
            End While
            Obj_Reader.Close()
        End Sub
    C'est sur "TYPE_ART_LIB" que je cherche à faire le LIKE *...*

    Merci à tous.

  2. #2
    Membre confirmé Avatar de hugoclo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 615
    Points : 480
    Points
    480
    Par défaut
    Et en utilisant ".contains"?
    Une boucle qui vérifie chaque case de la colonne voulu, si contains est true laisse affiche si containet false n'affiche pas la ligne.
    Ou plus simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     While Obj_Reader.Read()
    if Obj_Reader.GetValue(XX).ToString().contains(textbox1.text) = true then, 
                dgv_art_obs.Rows.Add(Obj_Reader.GetValue(0).ToString(), Obj_Reader.GetValue(1).ToString(), Obj_Reader.GetValue(2).ToString(), Obj_Reader.GetValue(3).ToString(), toMoney(Obj_Reader.GetValue(4).ToString()), toMoney(Obj_Reader.GetValue(5).ToString()), toPercent(Obj_Reader.GetValue(6).ToString()), toMoney(Obj_Reader.GetValue(7).ToString()), toMoney(Obj_Reader.GetValue(8).ToString()), Obj_Reader.GetValue(9).ToString())
    end if
            End While
            Obj_Reader.Close()
    Lorsque le sage montre la lune du doigt l'idiot regarde le doigt.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci pour votre réponse.
    Je viens d'essayer et cela ne m'affiche plus rien lorsque je tape un caractère dans la textbox en question.
    Peut-être que j'ai mal fait quelque chose?
    Si vous pouviez y jeter un oeil ce serait gentil.

    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
     
        Public Sub affichage_dgv_act()
            dgv_art_act.Rows.Clear()
     
            'Instancier un objet Commande
            Obj_Command = New OleDbCommand()
            'initialiser l'objet Command
            Obj_Command.Connection = laConnection
            Obj_Command.CommandText = "SELECT TYPE_ART_ID,TYPE_REF_FOURN,TYPE_REF_CONST,TYPE_ART_LIB,TYPE_ART_PV_HT,TYPE_ART_ECO_PART,TAXE_TAUX,TYPE_ART_PV_TTC,TYPE_ART_PA,TYPE_ART_QTE FROM TYPE_ARTICLE,TAXE WHERE TYPE_ARTICLE.TAXE_ID=TAXE.TAXE_ID AND TYPE_ART_TYP='Actuel' AND (TYPE_REF_FOURN LIKE '" + Replace(tbx_art_rec_act_ref.Text, "'", "''") + "%' OR TYPE_REF_FOURN IS NULL) AND (TYPE_REF_CONST LIKE '" + Replace(tbx_art_rec_act_rec.Text, "'", "''") + "%' OR TYPE_REF_CONST IS NULL) AND (TYPE_ART_LIB LIKE '" + Replace(tbx_art_rec_act_design.Text, "'", "''") + "%' OR TYPE_ART_LIB IS NULL) AND (TYPE_ART_PV_HT LIKE '" + Replace(tbx_art_rec_act_ht.Text, "'", "''") + "%' OR TYPE_ART_PV_HT IS NULL) AND (TYPE_ART_ECO_PART LIKE '" + Replace(tbx_art_rec_act_ecopart.Text, "'", "''") + "%' OR TYPE_ART_ECO_PART IS NULL) AND (TAXE_TAUX LIKE '" + Replace(tbx_art_rec_act_tva.Text, "'", "''") + "%' OR TAXE_TAUX IS NULL) AND (TYPE_ART_PV_TTC LIKE '" + Replace(tbx_art_rec_act_ttc.Text, "'", "''") + "%' OR TYPE_ART_PV_TTC IS NULL) AND (TYPE_ART_QTE LIKE '" + Replace(tbx_art_rec_act_qte.Text, "'", "''") + "%' OR TYPE_ART_QTE IS NULL)"
     
            Obj_Reader = Obj_Command.ExecuteReader()
            While Obj_Reader.Read()
                If Obj_Reader.GetValue(3).ToString().Contains(tbx_art_rec_act_design.Text) = True Then
                    dgv_art_act.Rows.Add(Obj_Reader.GetValue(0).ToString(), Obj_Reader.GetValue(1).ToString(), Obj_Reader.GetValue(2).ToString(), Obj_Reader.GetValue(3).ToString(), toMoney(Obj_Reader.GetValue(4).ToString()), toMoney(Obj_Reader.GetValue(5).ToString()), toPercent(Obj_Reader.GetValue(6).ToString()), toMoney(Obj_Reader.GetValue(7).ToString()), toMoney(Obj_Reader.GetValue(8).ToString()), Obj_Reader.GetValue(9).ToString())
                End If
            End While
            Obj_Reader.Close()
        End Sub
     
     
     
     'Fonctions de recherche dans le DataGridView des articles actuels
     
        Private Sub tbx_art_rec_act_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tbx_art_rec_act_ref.TextChanged, tbx_art_rec_act_rec.TextChanged, tbx_art_rec_act_design.TextChanged, tbx_art_rec_act_ht.TextChanged, tbx_art_rec_act_ecopart.TextChanged, tbx_art_rec_act_tva.TextChanged, tbx_art_rec_act_ttc.TextChanged, tbx_art_rec_act_qte.TextChanged
            affichage_dgv_act()
            lbl_nb_art.Text = dgv_art_act.RowCount
        End Sub
    Merci beaucoup pour votre aide.

  4. #4
    Membre confirmé Avatar de hugoclo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 615
    Points : 480
    Points
    480
    Par défaut
    En Fait vous voulez filtrer une fois les données dans le datagridview.
    Vous pouver uiliser ce code comme point de depart:
    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 Form1_Load(ByVal sender As System.Object,ByVal e As System.EventArgs) HandlesMyBase.Load 
    Dim ds As DataSet      
    Dim con as OleDbConnection = New OleDbConnection("Provider=Microsoft.jet.oledb.4.0;data source=D:\myDB.mdb")       
    Dim cmd As OleDbCommand = New OleDbCommand("SELECT TYPE_ART_ID,TYPE_REF_FOURN,TYPE_REF_CONST,TYPE_ART_LIB,TYPE_ART_PV_HT,TYPE_ART_ECO_PART,TAXE_TAUX,TYPE_ART_PV_TTC,TYPE_ART_PA,TYPE_ART_QTE FROM TYPE_ARTICLE,TAXE WHERE TYPE_ARTICLE.TAXE_ID=TAXE.TAXE_ID AND TYPE_ART_TYP='Actuel' AND (TYPE_REF_FOURN LIKE '" + Replace(tbx_art_rec_act_ref.Text, "'", "''") + "%' OR TYPE_REF_FOURN IS NULL) AND (TYPE_REF_CONST LIKE '" + Replace(tbx_art_rec_act_rec.Text, "'", "''") + "%' OR TYPE_REF_CONST IS NULL) AND (TYPE_ART_LIB LIKE '" + Replace(tbx_art_rec_act_design.Text, "'", "''") + "%' OR TYPE_ART_LIB IS NULL) AND (TYPE_ART_PV_HT LIKE '" + Replace(tbx_art_rec_act_ht.Text, "'", "''") + "%' OR TYPE_ART_PV_HT IS NULL) AND (TYPE_ART_ECO_PART LIKE '" + Replace(tbx_art_rec_act_ecopart.Text, "'", "''") + "%' OR TYPE_ART_ECO_PART IS NULL) AND (TAXE_TAUX LIKE '" + Replace(tbx_art_rec_act_tva.Text, "'", "''") + "%' OR TAXE_TAUX IS NULL) AND (TYPE_ART_PV_TTC LIKE '" + Replace(tbx_art_rec_act_ttc.Text, "'", "''") + "%' OR TYPE_ART_PV_TTC IS NULL) AND (TYPE_ART_QTE LIKE '" + Replace(tbx_art_rec_act_qte.Text, "'", "''") + "%' OR TYPE_ART_QTE IS NULL)", con)       
    con.Open()       
    Dim myDA As OleDbDataAdapter = New OleDbDataAdapter(cmd)       
    ds = New DataSet()       
    myDA.Fill(ds, "MyTable")       
    con.Close()       
    DataGridView1.DataSource = ds.Tables("MyTable").DefaultView   
    End Sub   
     
    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged       
    Dim keywords AsString = tbx_art_rec_act_design.Text       
    ds.Tables("MyTable").DefaultView.RowFilter = "Field1 =" & keywords       
    ' ou 
    '= "Field1 Like '%" & keywords & "%' "      
    End Sub
    Autrement il faud passer par bindingsource voir ici
    Lorsque le sage montre la lune du doigt l'idiot regarde le doigt.

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    L'option du BindingSource me plaisait bien (je l'avais déjà lue et essayée) mais je me suis rendu compte que ce n'est pas possible dans mon cas..
    En effet, je n'ai pas de DataSet, ni de TableAdapter, ni de BindingSource.
    En fait je travaille directement sur ma base de données Access en ouvrant et en refermant la connexion dessus.

    Vous pensez que je suis obligé de passer par là?

    Il n'y aurait pas la possibilité de placer mes étoiles *...* dans cette partie du code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND (TYPE_ART_LIB LIKE '" + Replace(tbx_art_rec_act_design.Text, "'", "''") + "%' OR TYPE_ART_LIB IS NULL) AND
    Dans la requête en fait.

    Merci bien pour votre réponse.

  6. #6
    Membre confirmé Avatar de hugoclo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 615
    Points : 480
    Points
    480
    Par défaut
    Je viens de reprendre à zéro.
    Régle avec LIKE :
    LIKE 'D%' commence par D
    LIKE '%D%' contient D
    LIKE '[DF]%' commence par D ou F
    Pour l'exemple avec sdd c'est normal que sa ne marche pas car d'aprés la requete il cherche un terme commencent par sdd et non contenant sdd je pense que la solution est: LIKE '%D%'
    Lorsque le sage montre la lune du doigt l'idiot regarde le doigt.

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Ah super ça !!

    Du coup il suffit que je mette %% dans ma ligne sans rien changer aux cotes ou double cotes?

  8. #8
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Je viens de faire le test comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (TYPE_ART_LIB LIKE '%" + Replace(tbx_art_rec_act_design.Text, "'", "''") + "%' OR TYPE_ART_LIB IS NULL) AND ...
    Et ça fonctionne très bien ! Super !! Merci pour votre aide.

    Il y a une syntaxe particulière pour chercher deux mots non successifs ?
    Lorsque je tape "SSD" il m'affiche les lignes contenant "SSD".
    Par contre, si je tape "SSD d", au lieu de m'afficher les lignes contenant "Disque dur SSD" il ne m'affiche plus rien.
    C'est bizarre non?

  9. #9
    Membre confirmé Avatar de hugoclo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    615
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 615
    Points : 480
    Points
    480
    Par défaut
    Non ce n'est pas bizzare
    avec %TOTO% la requete va chercher la ligne qui contient XXXXTOTOXXX
    donc si on a TUTU TOTO TATA ca marche.
    Maintenant si je recherche %TOTO D% il ne trouvera rien mais si j'ai
    %TOTO T% ou %U TOTO% là ca marche.
    Donc avec votre exemple "Disque dur SSD" il n'y a rien derriere SSD donc un like %SSD d% aucun retour.
    Maintenant si on fait un LIKE%r SSD% ou %dur SSD% la il y aura des réponses.
    Pensez au tag RESOLU
    Lorsque le sage montre la lune du doigt l'idiot regarde le doigt.

  10. #10
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2012
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2012
    Messages : 6
    Points : 1
    Points
    1
    Par défaut
    Oui je comprends c'est logique dans ce cas.

    Du coup, existe-t-il un moyen de faire ceci : "xxx ET yyy" ?

    Ce serait l'équivalent d'une recherche dans un moteur de recherche du genre Google quoi, mais dans mon DGV

    Merci pour votre aide en tout cas.
    Je mets le résolu.

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

Discussions similaires

  1. [XL-2013] Trier les lignes d'un tableau à partir d'une liste de ligne
    Par dttpedt dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 06/08/2014, 15h59
  2. Réponses: 3
    Dernier message: 14/06/2014, 00h47
  3. Réponses: 31
    Dernier message: 27/11/2010, 19h14
  4. Réponses: 4
    Dernier message: 04/11/2008, 10h39
  5. [VB.NET]Comment supprimer les lignes d'un datagridView
    Par vijeo dans le forum Windows Forms
    Réponses: 1
    Dernier message: 01/09/2006, 17h54

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