IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Liste de string que l'on peux binder, trier et serializer/déserializer. [Débutant]


Sujet :

VB.NET

  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut Liste de string que l'on peux binder, trier et serializer/déserializer.
    Bonjour a tous,
    j'ai encore un petit soucis, j'espère que vous pourrez m'aider.
    Je rencontre plusieurs problèmes pour trouver une liste de String qui puisse être bindée, triée et Serializée/Desérializée.

    A Priori j'ai trouvé les ObservableCollections et les SortedSet (of T) qui peuvent être toutes les deux bindées.
    - 1er Problème avec les ObservablesCollections : je ne parviens pas a trier la liste.
    - 2eme problème avec les SortedList (of T) : j'ai le message d'erreur suivant au moment d'instancier la variable "Serializer" :
    Vous devez implémenter un accesseur par défaut sur System.Collections.Generic.SortedSet`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]], car il hérite de ICollection.
    Un bout de code plus parlant pour alimenter un ComboBox :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim MaListeOfString as new ????
    Combobox1.Datasource = MaListeOfString
    Pour Déserializer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Function LoadXmlData(ByVal path As String, ByVal Objet As Object) As Object
            Dim Type As Type = Objet.GetType
            Dim Serializeur As New XmlSerializer(Type)
            LoadXmlData = Nothing
            ' Déserialization
            Using fs As New FileStream(path, FileMode.Open, FileAccess.Read)
                LoadXmlData = Serializeur.Deserialize(fs)
                fs.Close()
            End Using
        End Function
    Éventuellement je suis ouvert a toutes autres propositions. L'idéal serait d'avoir une liste triée automatiquement ou au moins de pouvoir présenter une vue triée dans le ComboBox.

    Si quelqu'un a une idée, ça m'aiderait beaucoup.

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 175
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 175
    Points : 25 116
    Points
    25 116
    Par défaut
    moi dans ces cas là j'ai une liste de données brute et une liste de données triées/filtrées
    dans le pire des cas faire les tris/filtres en remettant le résultat dans la même variable

  3. #3
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    oupss, j'ai oublié de préciser comment je déserialize dans le cas ou MaListeOfString est du type SortedSet (of T) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaListeOfString = CType(LoadXMLData(Application.StartupPath & "/" & "fichier.xml", MaListeOfString), Global.System.Collections.Generic.SortedSet(Of String))

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    merci beaucoup Pol63, j'ai fait comme ceci :
    Je pense que c'est ce qu'il fallait comprendre. En tout cas ça fonctionne .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MaListOfString = New System.Collections.ObjectModel.ObservableCollection(Of String)(MaListOfString.OrderBy(Function(s) s))
    Au passage j'en profite pour rectifier ce que j'ai écrit : A priori les SortedSet ne sont pas fait pour être bindés.

    Merci beaucoup.

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonsoir a tous,
    je complète et rectifie ma réponse. J'ai rencontré quelques problèmes d'actualisation des contrôles UI (un ComboBox dans mon cas) avec les ObservableCollection, ceux-ci étant attachés a la propriété DataSource.
    Je crois que j'ai enfin fini par trouver la solution que je cherche depuis un bout de temps avec les BindingList (of T). En effet j'essaye d'utiliser le plus possible les liaisons de source de données, je trouve que ça très pratique. Sans cela ça oblige a écrire 2 fois le même code par exemple quand on veux ajouter/supprimer/modifier un élément a la collection il faut l'ajouter/supprimer/modifier également au controle UI.
    Avec les BindingList je peux enfin modifier ma liste et tous les contrôles attachés a cette liste par leur propriété DataSource se mette a jour automatiquement. le seul soucis c'est que je n'est pas réussi a trier le BindingList se qui m'a obligé a passer par un List (of T) intermediaire.

    Voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Dim Liste As New List(Of String)
            Liste = CType(LoadXMLData(Application.StartupPath & "/" & "Liste.xml", Liste), Global.System.Collections.Generic.List(Of String))
            Liste.Sort()
            MaListeOfString = New System.ComponentModel.BindingList(Of String)(Liste)
     
    ComboBox1.DataSource = MalisteOfString
    ComboBox2.DataSource = MalisteOfString
     
    MaListOfString.Add("Item1") ' Ajoute un élément dans la liste et dans tous les ComboBox attachés a la liste.
    MaListeOfString.Remove("Item1") ' Supprime un élément dans la liste et dans tous les ComboBox attachés a la liste.
    MaListeOfString.Item(MaListeOfString.IndexOf("Item1")) = "Item2" ' Modifie un élément dans la liste et dans tous les ComboBox attachés a la liste.
    N'hesitez pas si vous avez des remarques.

  6. #6
    Membre éclairé
    Homme Profil pro
    Technicien bio médical
    Inscrit en
    Décembre 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien bio médical
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 328
    Points : 768
    Points
    768
    Par défaut
    Bonjour,
    Vous pouvez peut être passer par un BindingSource. Il possède de nombreuses méthodes, dont le tri et les filtres.

    Bon dev.

  7. #7
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonjour Rainui et merci de ta réponse.
    Vous pouvez peut être passer par un BindingSource. Il possède de nombreuses méthodes, dont le tri et les filtres.
    J'ai déjà essayé le BindingSource. Cela aurait pu être une solution en effet sauf que si on fait une liaison entre plusieurs contrôles et une source, la sélection d'un élément dans un contrôle a pour effet de sélectionner également cet élément dans les autres contrôles. La raison est qu'un BindingSource ne peux gérer qu'un seul CurrencyManager. (Il n'y peux y avoir qu'un seul CurrencyManager pour une même source).
    Et les notification ne fonctionnent pas toujours il faut faire un BindingSource.ResetBindings (False) selon si la source implémente InotifyCollectionChanged et INotifyPropertyChanged ou pas.

    Avec les BindingList je n'ai pas rencontré ce soucis. Tous les contôles sont bien mis a jour lorsque on modifie un élément dans la source mais chaque contrôles restent indépendant en terme de sélection ou de positionnement sur un element lié a la source la source.

  8. #8
    Membre éclairé
    Homme Profil pro
    Technicien bio médical
    Inscrit en
    Décembre 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien bio médical
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 328
    Points : 768
    Points
    768
    Par défaut
    Bonjour,
    j'ai tourné le code que vous avez donné dans le post précédent dans tout les sens et les contrôles bindés à MaListeOfString restent synchronisée à la sélection

  9. #9
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    j'ai tourné le code que vous avez donné dans le post précédent dans tout les sens et les contrôles bindés à MaListeOfString restent synchronisée à la sélection
    Voilà qui est interressant. Je confirme que j'ai bien 2 combobox attachés a la même BindingList et la selection sur un comboBox ne modifie pas la selection du 2eme ComboBox. Je regarderais cela de plus prêt. Je précise que mes 2 ComboBox ne sont pas sur le même formulaire, ceci explique peut-être cela.

  10. #10
    Membre éclairé
    Homme Profil pro
    Technicien bio médical
    Inscrit en
    Décembre 2012
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien bio médical
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2012
    Messages : 328
    Points : 768
    Points
    768
    Par défaut
    Bonjour,
    Je précise que mes 2 ComboBox ne sont pas sur le même formulaire, ceci explique peut-être cela.
    Je n'avais pas pensé à ça ...

    En cherchant à vous aider, je suis tombé sur SortedBindingList(Of T). Cet exemple peut peut être vous aider.

  11. #11
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    640
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Bâtiment

    Informations forums :
    Inscription : Mars 2012
    Messages : 640
    Points : 372
    Points
    372
    Par défaut
    Bonsoir Rainui, merci beaucoup pour ton intervention.
    Donc effectivement les contrôles sont bien synchronisés si il sont sur le même formulaire. Je n'en connais pas la raison mais ce fonctionnement par défaut me va bien.
    Par contre j'ai testé la classe SortedBindingList (of T), je pense que c'est moi qui ne sais pas s'en servir mais la liste n'est pas trié automatiquement quand on ajoute un élément.
    Si quelqu'un sait comment faire...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. transformer liste en string puis en liste et ne lire que 1 element sur 2
    Par cedric190985 dans le forum Général Python
    Réponses: 5
    Dernier message: 26/03/2010, 15h02
  2. Fichier que je ne peux plus effacer...
    Par mosquito_ch dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 18/01/2006, 07h43
  3. [VB.net] Join d'un Array list de string?
    Par the_bmo dans le forum VB.NET
    Réponses: 8
    Dernier message: 15/12/2005, 13h53
  4. Comparaison d'une liste de string à un string
    Par maxazac dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 19/10/2005, 15h39
  5. Réponses: 4
    Dernier message: 24/06/2004, 12h13

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