p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    janvier 2004
    Messages
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 92
    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
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Â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 523
    Points : 40 014
    Points
    40 014

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 92
    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
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 92
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Â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 523
    Points : 40 014
    Points
    40 014

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 92
    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
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 92
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Développeur .NET
    Inscrit en
    février 2004
    Messages
    19 523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Â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 523
    Points : 40 014
    Points
    40 014

    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
    92
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : janvier 2004
    Messages : 92
    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.

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/06/2015, 20h20
  2. Réponses: 1
    Dernier message: 19/02/2014, 10h57
  3. BindingSource LINQ TO SQL DataGridView
    Par rvaouate dans le forum C#
    Réponses: 1
    Dernier message: 18/10/2012, 13h49
  4. Réponses: 8
    Dernier message: 01/12/2010, 14h49
  5. [C#] méthodes pour filtrer un datagridview ?
    Par tikam dans le forum Windows Forms
    Réponses: 3
    Dernier message: 16/08/2006, 12h24

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