none
Requête en mémoire et List(Of RRS feed

  • Question

  • Bonjour à tous,

    je nage un peu avec linq....

    Je travaille sur un projet Silverlight Wcf.

    J'utilise énormément de liste génériques (System.Collections.Generic.List). Je récupére ces listes dans Silverlight depuis mes services WCF.

    Je mets souvent ces listes dans des DataGrid.

    Jusqu'ici, tout va bien.

    Maintenant, je veux enlever certains éléments de la liste que j'affiche dans mon DGV. J'ai tenté cette solution (peut-être n'est-elle pas bonne???) :

     Dim lclistetransporteur2 As New List(Of transporteur_log)
        Private Sub recup_transporteurtermine(ByVal sender As Object, ByVal e As recup_transporteur_2CompletedEventArgs)
            lclistetransporteur2 = e.Result.liste_transp.Where(Function(f) f.sommeil = False)
            data_transporteur.ItemsSource = lclistetransporteur2
        End Sub

    Et la, erreur, impossible de convertir un oblet de type IEnumerable(Of en list(Of ou un truc du genre.

    N'y a-t-il pas un moyen de faire un select sur une liste pour le mettre directement dans une liste du même type (ce serait quand même pratique)?

    Bref, je tente une deuxième solution en passant par un objet temporaire :

     Dim lclistetransporteur2 As New List(Of transporteur_log)
        Private Sub recup_transporteurterminemlkj(ByVal sender As Object, ByVal e As recup_transporteur_2CompletedEventArgs)
            lclistetransporteur2.Clear()
            Dim lclisttmp = e.Result.liste_transp.Where(Function(f) f.sommeil = False)
            lclistetransporteur2.AddRange(lclisttmp)
            data_transporteur.ItemsSource = lclistetransporteur2
    
        End Sub

    Wouaouh, ça marche...J'ai bien la bonne liste dans lclistetransporteur2. Mais, tant que je ne clique pas sur mon DGV, ce dernier ne s'actualise plus, ce qui est très moche pour l'utilisateur (si la collection n'est pas de type IObservable, le "Refresh" ne se fais pas automatiquement dans Silverlight) !!!

    Ma liste est passé de IObservable à IPasObservable (il y a la un truc qui m'échappe)???

    Je vois bien une troisième solution super moche qui consisterait à faire un truc genre

    Dim lclistetransporteur2 As New List(Of transporteur_log)
        Private Sub recup_transporteurterminemlkj(ByVal sender As Object, ByVal e As recup_transporteur_2CompletedEventArgs)
            lclistetransporteur2.Clear()
            For Each lctransp As transporteur_log In e.Result.liste_transp
                If lctransp.sommeil = False Then
                    lclistetransporteur2.Add(lctransp)
                End If
            Next
            data_transporteur.ItemsSource = lclistetransporteur2
    
        End Sub

    mais, en faisant ça, j'ai un peu l'impression de faire du Linq à la main et de réinventer le .net...Je trouve ça ballo...

    En espérant avoir été assez clair...

    Merci pour vos idées, conseils, solution...

    lundi 29 octobre 2012 09:46

Réponses

  • Bonjour,

    Si vous avez fait un Bind sur ItemSource, essayez de travailler directement sur le DGV, du genre datagridview1.Rows.Remove(datagridview1.CurrentRow) ou avec datagridview1.Items.Remove(datagridview1.SelectedItem), je ne sais le quel est à appliquer (à tester). Normalement comme le datasource est lié, ça devrait ce supprimer.

    Maintenant si vous travaillez directement sur le ListOf, il faut faire une copie de cette liste, parcourir l'originale, supprimer les éléments dans la copie, puis réaffecter la liste original par la copie (vous pouvez utiliser LINQ pour la recherche des éléments à supprimer). Normalement il n'y aura plus de problème.

    Il faut savoir que vous ne pouvez parcourir des éléments dont l'index évolue (suppression/ajout d'élément tout en parcourant).

     

    Est-ce que cela vous aides dans votre démarche ?

     

    Cordialement


    Merci de valider par "Proposer comme réponse" si celle-ci répond à votre demande !

    • Proposé comme réponse Aurel Bera mardi 30 octobre 2012 10:38
    • Marqué comme réponse bobertin mercredi 31 octobre 2012 10:42
    lundi 29 octobre 2012 13:24
  • Bonjour,

    d'abord merci pour l'astuce de la deuxième liste.

    Cela dit, solution moche pour solution moche, je vais plutôt faire la troisième solution que j'avais évoqué dans mon premier post...

    Bon dev à tous...

    • Marqué comme réponse bobertin mercredi 31 octobre 2012 10:42
    mercredi 31 octobre 2012 10:42

Toutes les réponses