Linq et datagridview

Signaler
Messages postés
159
Date d'inscription
samedi 29 septembre 2012
Statut
Membre
Dernière intervention
21 juin 2016
-
Messages postés
15441
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
27 janvier 2021
-
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

Messages postés
15441
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
27 janvier 2021
503
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.
Messages postés
159
Date d'inscription
samedi 29 septembre 2012
Statut
Membre
Dernière intervention
21 juin 2016
1
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
Messages postés
15441
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
27 janvier 2021
503
En mode débug, y a t-il des enregistrements dans horaireQuery?
Messages postés
159
Date d'inscription
samedi 29 septembre 2012
Statut
Membre
Dernière intervention
21 juin 2016
1
Comment vérifier cela?
Messages postés
159
Date d'inscription
samedi 29 septembre 2012
Statut
Membre
Dernière intervention
21 juin 2016
1
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.
Messages postés
159
Date d'inscription
samedi 29 septembre 2012
Statut
Membre
Dernière intervention
21 juin 2016
1
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)
Messages postés
15441
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
27 janvier 2021
503
À 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()

Messages postés
159
Date d'inscription
samedi 29 septembre 2012
Statut
Membre
Dernière intervention
21 juin 2016
1
Je ne m'y connais pas beaucoup en classe, mais je vais regarder à ça.
Messages postés
15441
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
27 janvier 2021
503
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
Messages postés
159
Date d'inscription
samedi 29 septembre 2012
Statut
Membre
Dernière intervention
21 juin 2016
1
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
Messages postés
15441
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
27 janvier 2021
503
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.



Messages postés
15441
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
27 janvier 2021
503
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.