Précédent   Forum du club des développeurs et IT Pro > Dotnet > Accès aux données > Entity Framework
Entity Framework Forum d'entraide sur le développement avec le modèle d'accès aux données Entity Framework de Microsoft.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 10/08/2012, 16h54   #1
laumon
Membre du Club
 
Homme
Développeur .NET
Inscription : janvier 2004
Messages : 82
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : janvier 2004
Messages : 82
Points : 46
Points : 46
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.
laumon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2012, 01h17   #2
tomlev
Rédacteur/Modérateur


 
Avatar de tomlev
 
Homme Thomas Levesque
Développeur .NET
Inscription : février 2004
Messages : 17 770
Détails du profil
Informations personnelles :
Nom : Homme Thomas Levesque
Âge : 31
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 : 17 770
Points : 33 992
Points : 33 992
Citation:
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.
__________________

Pas de questions techniques par MP ! Le forum est là pour ça...

Tutoriels : Les markup extensions en WPF - La sérialisation XML avec .NET (Aller plus loin) - Une visite guidée de WPF (traduction)
Projet : Dvp.NET, la librairie .NET open-source des membres de Developpez !
tomlev est actuellement connecté   Envoyer un message privé Réponse avec citation 20
Vieux 13/08/2012, 11h01   #3
laumon
Membre du Club
 
Homme
Développeur .NET
Inscription : janvier 2004
Messages : 82
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : janvier 2004
Messages : 82
Points : 46
Points : 46
Merci beaucoup Tomlev, c'est LA réponse qui me sauve.
Laumon.
laumon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2012, 15h34   #4
laumon
Membre du Club
 
Homme
Développeur .NET
Inscription : janvier 2004
Messages : 82
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : janvier 2004
Messages : 82
Points : 46
Points : 46
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.
laumon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/08/2012, 15h57   #5
tomlev
Rédacteur/Modérateur


 
Avatar de tomlev
 
Homme Thomas Levesque
Développeur .NET
Inscription : février 2004
Messages : 17 770
Détails du profil
Informations personnelles :
Nom : Homme Thomas Levesque
Âge : 31
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 : 17 770
Points : 33 992
Points : 33 992
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;
__________________

Pas de questions techniques par MP ! Le forum est là pour ça...

Tutoriels : Les markup extensions en WPF - La sérialisation XML avec .NET (Aller plus loin) - Une visite guidée de WPF (traduction)
Projet : Dvp.NET, la librairie .NET open-source des membres de Developpez !
tomlev est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 13/08/2012, 16h17   #6
laumon
Membre du Club
 
Homme
Développeur .NET
Inscription : janvier 2004
Messages : 82
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : janvier 2004
Messages : 82
Points : 46
Points : 46
Même pas la peine de compter, le ToList() m'a enlevé cette ligne.
Merci pour ta réactivité Tomlev.
+1

Laumon.
laumon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2012, 14h50   #7
laumon
Membre du Club
 
Homme
Développeur .NET
Inscription : janvier 2004
Messages : 82
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : janvier 2004
Messages : 82
Points : 46
Points : 46
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.
laumon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2012, 16h03   #8
tomlev
Rédacteur/Modérateur


 
Avatar de tomlev
 
Homme Thomas Levesque
Développeur .NET
Inscription : février 2004
Messages : 17 770
Détails du profil
Informations personnelles :
Nom : Homme Thomas Levesque
Âge : 31
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 : 17 770
Points : 33 992
Points : 33 992
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.
__________________

Pas de questions techniques par MP ! Le forum est là pour ça...

Tutoriels : Les markup extensions en WPF - La sérialisation XML avec .NET (Aller plus loin) - Une visite guidée de WPF (traduction)
Projet : Dvp.NET, la librairie .NET open-source des membres de Developpez !
tomlev est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/08/2012, 17h56   #9
laumon
Membre du Club
 
Homme
Développeur .NET
Inscription : janvier 2004
Messages : 82
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Développeur .NET

Informations forums :
Inscription : janvier 2004
Messages : 82
Points : 46
Points : 46
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.
laumon est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h35.


 
 
 
 
Partenaires

Hébergement Web