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 :

Recherche de row dans un DataGridView via une textbox [Débutant]


Sujet :

VB.NET

  1. #21
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    On pourrait aussi essayer quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim dt as DataTable = d2015_MySqlResultAsTable
    dgvtest.DataSource = (From dr as DataRow In dt.Rows() 'ou dt.AsEnumerable selon la doc MSDN
                                   Where dr.item(1).ToString.ToUpper.StartsWith("C"c)
                                   Select dr).ToList()
    Kropernic

  2. #22
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 166
    Points : 86
    Points
    86
    Par défaut
    Bonjour Pol63
    Oui, je viens de tester ton code auquel j'y ai ajouté des commentaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            Dim dt As DataTable = d2015_MySqlResultAsTable
            If dt.Rows.Count > 0 Then MsgBox("> 0 ok")
            ' j'ai bien le msgbox comme quoi j'ai dt.Row > 0
            Dim ds = dt.AsEnumerable.Where(Function(x As DataRow) x.Item(1).ToString.StartsWith("C"))
            If ds.Count = 0 Then MsgBox("trop filtré !")
            ' ici pas de msgbox ce qui implique que le count du filtrage est > 0
            dgvtest.DataSource = ds
    le DgvTest reste désespérément vide
    Il semble que le contenu de ds (après tri par la fonction) n'ai rien à voir avec celui de la Table dt (originale).
    J'ai bien le nombre de colonne, nombre de lignes attendu, mais le contenu ne correspond pas du tout au type de contenu de ma table d'origine.
    Humm!! c'est à devenir dingue
    Patrick

  3. #23
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Citation Envoyé par patrickvier Voir le message
    J'ai bien le nombre de colonne, nombre de lignes attendu, mais le contenu ne correspond pas du tout au type de contenu de ma table d'origine.
    Qu'est-ce qui est différent exactement ?

    Sinon, je persiste et je signe avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dgvTest.DataSource = ds.ToList()
    Faudrait éventuellement aussi voir comment les colonnes de ton dgv sont initialisées. Car si jamais tu les as bindées pour matcher un nom de colonne de ta table par exemple, je ne suis pas sûr que la requête linq ou la fonction lambda conserve les noms et du coup, il y a bien du contenu en DataSource du dgv mais ce n'est pas affiché car il ne sait pas où le mettre ^^.
    Kropernic

  4. #24
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 166
    Points : 86
    Points
    86
    Par défaut
    Bon, j'ai décidé de créer directement une table from scratch en code, pour que vous puissiez tester vous aussi.
    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
            ' Debut partie test
            ' Création de la Table
            Dim dt As New DataTable
            dt.Columns.Add("id", GetType(Integer))
            dt.Columns.Add("numero", GetType(String))
            dt.Columns.Add("nom", GetType(String))
            ' Fill de la table
            dt.Rows.Add(1, "83", "VAR")
            dt.Rows.Add(2, "C83", "HYERES")
            dt.Rows.Add(3, "C83", "SAINTE-MAXIME")
            dt.Rows.Add(4, "C83", "LA CRAU")
     
            If dt.Rows.Count > 0 Then MsgBox("> 0 ok")
            ' j'ai bien le msgbox comme quoi j'ai dt.Row > 0
            Dim ds = dt.AsEnumerable.Where(Function(x As DataRow) x.Item(1).ToString.StartsWith("C")).ToList
            If ds.Count = 0 Then MsgBox("trop filtré !")
            ' ici pas de msgbox ce qui implique que le count du filtrage est > 0
            DataGridView1.DataSource = ds
            'Exit Sub
            ' Fin Partie Test
    J'ai créé un DatagridView1 from scratch (pas de bind ou autre) dans la Form principale.
    Ci dessous un snapshot du résultat dans le datagridview1 :
    Nom : dgv.jpg
Affichages : 112
Taille : 18,1 Ko

    Sans le "ToList", le dgv est vide.
    Là, je suis perplexe...
    Patrick

  5. #25
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Voici ma copie corrigée ^^
    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
            ' Debut partie test
            ' Création de la Table
            Dim dt As New DataTable
            dt.Columns.Add("id", GetType(Integer))
            dt.Columns.Add("numero", GetType(String))
            dt.Columns.Add("nom", GetType(String))
            ' Fill de la table
            dt.Rows.Add(1, "83", "VAR")
            dt.Rows.Add(2, "C83", "HYERES")
            dt.Rows.Add(3, "C83", "SAINTE-MAXIME")
            dt.Rows.Add(4, "C83", "LA CRAU")
     
            'If dt.Rows.Count > 0 Then MsgBox("> 0 ok")
            ' j'ai bien le msgbox comme quoi j'ai dt.Row > 0
            'Dim ds = dt.AsEnumerable.Where(Function(x As DataRow) x.Item(1).ToString.StartsWith("C")).ToList
            Dim ds = (From dr As DataRow In dt.AsEnumerable
                      Where dr.Item(1).ToString.ToUpper.StartsWith("C")
                      Select id = dr.Item(0), numero = dr.Item(1), nom = dr.Item(2))
            'If ds.Count = 0 Then MsgBox("trop filtré !")
            ' ici pas de msgbox ce qui implique que le count du filtrage est > 0
            dgv.DataSource = ds.ToList
            'Exit Sub
            ' Fin Partie Test
    Le problème vient du fait qu'on passe au DGV une liste d'objets de type DataRow. Et comme on le voit dans l'exemple que tu viens de donner, les propriétés affichées sont celles d'un objet de ce type. Or ce qu'on veut afficher, c'est ce qu'il y a dans la collection Item pour chaque datarow de la liste qu'on passe. Bon après, pourquoi il n'y a que ces 4 là affichées et pas toutes les autres, faudrait voir comment la classe DataRow est faite.

    A ma connaissance, "la profondeur d'affichage" (si qqn à un meilleur terme, je suis preneur) d'un dgv n'est que de 1. Pas moyen d'aller chercher une propriété dans une liste [qui est dans une liste] qui est dans liste.
    Donc dans ma version, j'ai été cherché ce que je voulais afficher et j'en ai fait une liste (de classe anonyme).

    C'est ce que fais le Select dans la requête Linq que j'ai écrite. Il crée "à la volée" une classe qui n'a pas de nom (on voit bien que je j'en donne pas), qui contient les propriétés "id", "numero" et "nom" et il y met les valeurs contenues respectivement dans Item(0), Item(1) et Item(2). Le type des propriétés de cette classe est inférée d'après le type de ce qu'on mets dedans.
    Kropernic

  6. #26
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 166
    Points : 86
    Points
    86
    Par défaut
    Kropernic,
    En effet, au vu de tes explications, c'est une incompatibilité, à priori, entre le dgv et la class datarow.
    Bon, en tout cas, j'avais déjà ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dgv.DataSource = From tb As DataRow In Table.AsEnumerable Where Not tb.Field(Of String)("numero").StartsWith("C") Select tb
    et ça marche, aussi.
    Merci de ton aide, mais cette fonction et/ou Sub de type lambda est vraiment intéressant.
    A bientôt
    Patrick

  7. #27
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 239
    Points
    4 239
    Par défaut
    Après réflexion, je pense que passer des datarows à un datagridview ne peut fonctionner que si on les donne via une datatable car c'est elle qui contient la définition des colonnes de la datarow. Sans quoi, le datagridview n'a qu'une liste d'objets et ne sait pas quoi en faire. Quelque chose d'approchant quoi.

    Voilà encore un argument de plus qui vient s'ajouter à ma liste contre les datatables, datarow, dataview et autres. Je préfère de loin créer mes propres objets. Ce genre de problème n'arrivent pas ^^.
    Kropernic

  8. #28
    Membre régulier
    Homme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    166
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2012
    Messages : 166
    Points : 86
    Points
    86
    Par défaut
    En effet, créer ses propres collections c'est plus flexible, mais je ne maitrise pas encore très bien tout ce qui est Class, Sub New, delegate et autres joyeusetés de ce genre là.
    Va falloir aussi que je regarde vers les Async et Await, BGworker... car ça aussi c'est bien intéressant. J'ai un truc à faire comme ça, mais pour l'instant j'ai juste besoin d'une pauvre ProgressBar qui déclenche à la fin d'un compteur, un event qui lui ira faire une requete. Donc j'ai déjà tout pour ça, mais pas la structure du BGworker. ceci dit, ça sera sur un autre post
    Je prend bien note de la super fonction anonyme
    Merci et je suis certain, à bientôt
    Patrick

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [Débutant] Changer couleur d'une row dans un Datagridview bindé
    Par jeremyvb11 dans le forum VB.NET
    Réponses: 5
    Dernier message: 13/01/2013, 15h32
  2. Bloquer une seule Row dans un DataGridView
    Par Contrec dans le forum C#
    Réponses: 4
    Dernier message: 05/09/2007, 13h07
  3. Réponses: 5
    Dernier message: 10/11/2006, 11h00
  4. Rechercher un mot dans les enregistrements d'une table access
    Par codial dans le forum Bases de données
    Réponses: 3
    Dernier message: 08/11/2006, 21h35
  5. Mise en forme dans un RTF via une syntaxe personnelle
    Par sqwalichou dans le forum Autres langages
    Réponses: 2
    Dernier message: 24/02/2006, 22h19

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