Linq et datagridview

edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016 - Modifié par Whismeril le 16/08/2014 à 14:29
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 20 août 2014 à 23:06
Bonjour,
Je suis bloqué avec les requêtes linq.
J'ai une datatable T_horaire que je remplis.
Je souhaite faire un affichage personnaliser de la table dans un datagridview.

Voici ma requête linq:

Dim horaireQuery = From elem In T_Horaire.AsEnumerable() _
                               Select New With {.HeureDebut = elem.Field(Of Date)("HeureDébut"), _
                                              .HeureFin = elem.Field(Of Date)("HeureFin")}
            DataGridView5.DataSource = horaireQuery.ToList


Mon Datagrid possède bien les deux colonnes "HeureDebut" et "HeureFin" mais il n'y a aucune ligne alors que ma T_Horaire est bien remplie.

Quelqu'un pourrait m'aider. (j'ai utiliser ce lien pour les requêtes linq: http://www.dotnet-france.com/Documents/ADOLinq/Linq%20To%20Dataset.pdf, et adapté le code à la page 10)

Merci

5 réponses

Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
16 août 2014 à 14:36
Bonjour,
je ne maitrise pas bien Linq en VB, mais en C# je m'en sors.

Première constatation, dans ton exemple (le pdf) il y a des parenthèses autours de la requête Linq, je ne sais pas si c'est important en VB, mais en C# oui.
Ensuite en .Net le type Date n'existe pas, c'est un "reliquat" de VB6, car dans ton projet tu as gardé la référence à Visual Basic.
En .Net c'est le type DateTime qu'il convient utiliser. Et avec ce type en C# on ne peut pas caster (la plupart du temps) directement une donnée dans un requête, il faut utiliser DateTime.TryParse avec la valeur de la base de données en string.

En espérant que cela t'aide.
0
edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016 2
16 août 2014 à 22:00
Merci, j'ai changé mais rien n'y fais: la colonne s'affiche mais il n'y a aucune ligne. Si je prends directement toute la table en linq, ça fonctionne correctement mais dès que je veux avoir qu'une seule colonne (ou plusieurs), aucune ligne ne s'affiche
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
16 août 2014 à 23:22
En mode débug, y a t-il des enregistrements dans horaireQuery?
0
edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016 2
17 août 2014 à 00:05
Comment vérifier cela?
0
edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016 2
17 août 2014 à 07:54
En mode debug, il ne donne aucune information concernant la propriété count de horairequery.
Par contre, j'ai fait une boucle et celle-ci n'affiche rien. Il n'y a donc aucun enregistrement dans ma requête.
0
edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016 2
17 août 2014 à 08:37
J'ai trouvé le problème mais pas la solution.
C'est le .tolist qui ne fonctionne pas. Si je ne fais pas de .tolist ma boucle me donne des éléments écrits comme ceci: {Compagnie = "LaCompagnie"}
(J'ai changé de champ, c'est pq il ne s'agit pas de HeureDébut mais de Compagnie)
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
17 août 2014 à 09:30
À tout hasard .ToList(), sinon, en C# il est conseiller d'éviter autant que possible le type anonyme.
Tu te crées une classe avec les propriétés que tu veux voir affichées et tu écrit ta requête en fonction
..... select new MaClasse {......}).ToList()

0
edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016 2
17 août 2014 à 10:10
Je ne m'y connais pas beaucoup en classe, mais je vais regarder à ça.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
17 août 2014 à 11:15
Pour l'exemple, une classe toute simple qui définit une personne par son nom, son prénom, sa date de naissance et la liste de ses enfants

Public Class Personne
    Public Sub New()
        Enfants = New List(Of Personne)()
    End Sub

    Public Property Nom() As String

    Public Property Prenom() As String

    Public Property Naissance() As DateTime

    Public Property Enfants() As List(Of Personne)
End Class
0
edwinzap Messages postés 149 Date d'inscription samedi 29 septembre 2012 Statut Membre Dernière intervention 21 juin 2016 2
20 août 2014 à 21:13
Bonjour,
J'ai finalement trouvé la solution.
Je plaçais la requête linq avant que le dataset ne contienne des données. C'est pq j'avais uniquement les colonnes et pas de lignes. (je pensais que ça fonctionnait comme un databinding)

Par contre, les formats Date et datetime ne fonctionnent pas comme me l'a dit Whismeril. Comment dois-je faire alors? (comment écrire cette partie de la requête (avec tryparse)?)

Merci
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
20 août 2014 à 22:45
Bonsoir

C'est le .tolist qui ne fonctionne pas. Si je ne fais pas de .tolist ma boucle me donne des éléments écrits comme ceci: {Compagnie = "LaCompagnie"}

Je plaçais la requête linq avant que le dataset ne contienne des données. C'est pq j'avais uniquement les colonnes et pas de lignes. (je pensais que ça fonctionnait comme un databinding)


Ha je n'y avais pas pensé, c'est le problème de l'exécution différée de Linq. SI tu fais ta requête, datable vide, mais que tu ne vas regarder le résultat qu'après avoir rempli le datable, ça va. Mais le ToList() force l'exécution "instantanée" et donc là tu te retrouves avec une liste vide... Il y a un exemple sur ce tuto.



0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
Modifié par Whismeril le 20/08/2014 à 23:15
Concernant les dates, un petit exemple de Parse et TryParse
        Dim maDateString As String = "20/08/2014 22:47:35"
        Dim maDateTime As DateTime = DateTime.Parse(maDateString)'maDateTime est rempli directement par le résultat du Parse

        Dim maDateTime2 as DateTime

        If DateTime.TryParse(maDateString, maDateTime2) Then
            'si TryParse réussi alors j'aurais la date dans la variable maDateTime2
        End If


TryParse retourne un bool et je ne pense pas qu'on puisse mettre une variable supplémentaire dans la requête
Donc soit tu fais un truc du style:
Select New With {.HeureDebut =  DateTime.Parse(elem.Field(Of string)("HeureDébut")), _
                                              .HeureFin = DateTime.Parse(elem.Field(Of string)("HeureFin"))}

avec le Parse (attention pas testé, je n'ai pas de bdd)

Ou alors tu écris une classe et tu te sers du constructeur (sub New(). Dans mon exemple plus haut il ne prenait pas de paramètres mais rien ne t'en empêche.
    Public Sub New(string DebutString, string FinString)
        Dim maDateTime as DateTime

        If DateTime.TryParse(DebutString, maDateTime) Then
            Debut = maDateTime
        Else
            Debut = Nothing
        End If
        
        Dim maDateTime2 As DateTime

        If DateTime.TryParse(FinString, maDateTime2) Then
            Fin = maDateTime2
        Else
            Fin = Nothing
        End If
    End Sub


et dans ta requête
Select New MaClasse(elem.Field(Of string)("HeureDébut"), elem.Field(Of string)("HeureFin"))

Penser aux balises de coloration syntaxique: bouton <>, préciser le langage :<code csharp>.
Quand la solution est trouvée, mettre la discussion Résolue.
0
Rejoignez-nous