Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 9 sur 9
  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 91
    Points : 50
    Points
    50

    Par défaut Filtrer un bindingsource (et donc un datagridview)

    Bonjour,

    J'ai un datagridview basé sur un bindingsource basé sur une table de l'entity framework.
    Dans la classe accédant à la table j'ai inséré une propriété publique (un booléen).
    Lorsque je veux remplir mon bindingsource en linq to sql je ne peux pas utiliser la condition 'Where' sur le booleen puisqu'il n'est pas dans la table.
    La solution serait de faire un filtre mais je ne sais pas comment le coder.

    D'ailleurs, de façon plus générale, je ne sais pas comment faire un filtre sur un datagridview basé sur un bindingsource dont le datasource est une table de l'entity framework.

    Comment dois-je m'y prendre ou avez-vous un lien vers un tutoriel ?

    Merci beaucoup.
    Laumon.

  2. #2
    Rédacteur/Modérateur



    Homme Profil pro Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 248
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 248
    Points : 38 962
    Points
    38 962

    Par défaut

    Lorsque je veux remplir mon bindingsource en linq to sql je ne peux pas utiliser la condition 'Where' sur le booleen puisqu'il n'est pas dans la table.
    C'est parce que la table Entity Framework est de type IQueryable, et tout ce qui est dans la requête est donc traduit en SQL. En fait, il faut d'abord faire ta requête sans inclure la condition sur ce bool, et ensuite prendre la requête en tant que IEnumerable et ajouter la condition :

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var dbQuery =
        from x in db.LaTable
        where ...
        select x;
     
    var query =
        from x in dbQuery.AsEnumerable()
        where x.TaProprieteBool
        select x;
    A partir de l'appel à AsEnumerable(), la requête s'exécute non pas dans la DB mais en mémoire, avec Linq to Objects.

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 91
    Points : 50
    Points
    50

    Par défaut

    Merci beaucoup Tomlev, c'est LA réponse qui me sauve.
    Laumon.

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 91
    Points : 50
    Points
    50

    Par défaut

    Tout est bon pour mon précédent souci.
    A présent j'essaie de transposer ça dans un écran de saisie où j'avais une condition de sélection. Je me heurte à un petit soucis...

    En écrivant
    Code :
    MonBindingSource.dataSource = query
    si "query" a 0 ligne, j'ai 1 ligne vide dans mon datagridview (+ la nouvelle ligne d'ajout. La ligne vide fait planter l'application.)
    En écrivant
    Code :
    MonBindingSource.dataSource = dbQuery
    je n'ai pas ce souci s'il y a 0 ligne, j'ai 1 ligne vide dans mon datagridview qui correspond bien à une nouvelle ligne de saisie.

    D'où sort cette ligne "non affectée/déconnectée" et comment faire pour qu'elle n'apparaisse plus?

    Merci.
    Laumon.

  5. #5
    Rédacteur/Modérateur



    Homme Profil pro Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 248
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 248
    Points : 38 962
    Points
    38 962

    Par défaut

    Citation Envoyé par laumon Voir le message
    D'où sort cette ligne "non affectée/déconnectée" et comment faire pour qu'elle n'apparaisse plus?
    Aucune idée... Essaie de faire un ToList() sur la requête pour voir combien elle contient d'éléments

    Code :
    1
    2
    var list = query.ToList();
    MonBindingSource.dataSource = list;

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 91
    Points : 50
    Points
    50

    Par défaut

    Même pas la peine de compter, le ToList() m'a enlevé cette ligne.
    Merci pour ta réactivité Tomlev.
    +1

    Laumon.

  7. #7
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 91
    Points : 50
    Points
    50

    Par défaut

    Bonjour,

    Je ne m'en sortirai pas de ce truc! Pourtant c'est pratique.

    1/ Mon datagridview est ok et lié au bindingsource.
    2/ mon bindingsource est ok et rempli grace à la liste

    Voici en simplifié les étapes qui me permettent de remplir le bindingsource.
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //lecture des données
    dbQuery = (From p In aContext.maTable
    Where p.annee = _Annee
    Select p)
     
    //filtre
    Dim list = (From x In dbQuery.AsEnumerable()
    Where x.CodeNature = _CodeNature
    Select x).ToList
     
    //actualisation bindingsource
    monBS.DataSource = list
    En modification de données je n'ai pas de pb.
    Par contre si j'ajoute ou supprime une ligne depuis le datagridview, lors de la sauvegarde via aContext.SaveChanges(), la base ne se met pas à jour.
    La je sèche... Quelqu'un a-t-il une proposition?
    Laumon.

  8. #8
    Rédacteur/Modérateur



    Homme Profil pro Thomas Levesque
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 248
    Détails du profil
    Informations personnelles :
    Nom : Homme Thomas Levesque
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2004
    Messages : 19 248
    Points : 38 962
    Points
    38 962

    Par défaut

    Normal : à cause du ToList, le DGV n'est plus bindé directement au DbContext, mais à une liste. Quand tu ajoutes un élément dans le DGV, ça l'ajoute donc à la liste, et le DbContext n'est pas modifié. Le AsEnumerable pose le même problème d'ailleurs...

    Je ne sais pas trop comment combiner les solutions à tes 2 problèmes... Tu pourrais essayer de récupérer dans la liste les éléments qui ont été ajoutés, et les ajouter manuellement au DbContext, mais c'est pas très pratique.

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2004
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 91
    Points : 50
    Points
    50

    Par défaut

    Merci,

    Finalement, la première solution m'a bien servi pour mon premier datagridview qui est en mode lecture seule.

    Quant à mon souhait d'extension à d'autres grilles, je n'ai pas à priori de solution simple (comprendre sans code supplémentaire).
    Je me cantonnerai à des parcours de datagridview pour rendre invisible les lignes que je ne souhaite pas voir (row.visible = false), ou à des appels en base de données à chaque demande de filtre.
    Et je poursuivrai mes recherches quand j'aurai plus de temps car je pense qu'il y a des solutions...

    Merci encore.
    Laumon.

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •