Sauvegarder de données et rappel

neolive31 Messages postés 20 Date d'inscription lundi 12 juillet 2010 Statut Membre Dernière intervention 11 avril 2011 - 22 nov. 2010 à 15:55
neolive31 Messages postés 20 Date d'inscription lundi 12 juillet 2010 Statut Membre Dernière intervention 11 avril 2011 - 24 nov. 2010 à 16:16
Bonjour à tous

Alors voilà, j'ai un problème que je n'arrive pas à résoudre depuis un bon moment. J'ai cherché la solution sur Internet dans nombreux forums, mais je n'ai rien trouvé encore. Donc je m'adresse à vous.

J'essaye de faire la chose suivante :

Général :
J'ai une form appelée Form1 pour l'exemple. Elle se compose de :

- 1 bouton (create_panel) qui a pour but de créer un panel à chaque clic. 1 clic = 1 panel. (ils se mettent les uns au dessous des autres.)

- Chaque panel est composé d'un textbox, d'un combobox et d'un label par exemple, dans lequel l'utilisateur rentre ou sélectionne des données.


Utilisation

En fin d'utilisation, on peut donc se retrouver avec 1 à i panel(s) chacun composés de données différentes dans ses éléments "propres".

Ce que je cherche à faire :

Je souhaite enregistrer les données des composants de la form (nbre de panel créer, données renseignées dans les textbox, combobox et label de chaque panel) pour pouvoir, après, en partant d'une form vide les recharger.

Pour l'instant, j'arrive à sauvegarder les données dans un fichier .txt (d'ailleurs si vous connaissez un autre format plus complet je suis preneur), les uns à la suite des autres.

Mais, lorsque l'utilisateur clic sur ouvrir, j'aimerai arriver à relire le fichier créé précédemment, et donc arriver automatiquement à recréer le bon nombre de panels et les bonnes données renseignées dans les éléments de chacun de ces panels.

Quelqu'un aurait il une petite idée qui me permettrait d'avancer?

J'espère avoir été assez clair.

Merci beaucoup de votre aide

Neolive

11 réponses

mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
22 nov. 2010 à 17:13
Bonjour,
Le plus simple est, à mon avis, de créer une classe qui contiendra les données que tu souhaites sauvegarder et rappeler. A savoir :
- le texte du textbox
- les éléments textes du combobox
- le texte du label
- etc.

Chaque nouveau panel fera l'objet d'une instanciation de cette classe.

Il ne restera plus ensuite qu'à sauvegarder la liste de ces éléments et pour cela je te conseille de faire appel à la sérialisation XML.
0
neolive31 Messages postés 20 Date d'inscription lundi 12 juillet 2010 Statut Membre Dernière intervention 11 avril 2011
22 nov. 2010 à 23:39
Salut

Merci déjà de ta réponse, ensuite je vais me rencarder un peu sur cette serialisation que je ne connais absolument pas.

Pourrais tu m'en dire un peu plus ?

merci encore

Neolive
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
23 nov. 2010 à 06:09
1ère chose, créer la classe qui se chargera de stocker les infos de chacun des panels créés.
J'ignore si les éléments du Combobox sont identiques d'un panel à l'autre. J'ai donc dans le doute stocké les éléments de ce Combobox dans une liste de strings :

 
    ''' <summary>
    ''' Contient les éléments constituant un Panel personnalisé
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Public Class clsMonPanel

        Private pTextBox As String
        Private pLabel As String
        Private pListeCombo As New List(Of String)
        Private pElementSelectionne As Integer

        Public Sub New()
        End Sub

        Public Property ContenuTextBox() As String
            Get
                Return pTextBox
            End Get
            Set(ByVal value As String)
                pTextBox = value
            End Set
        End Property

        Public Property ContenuLabel() As String
            Get
                Return pLabel
            End Get
            Set(ByVal value As String)
                pLabel = value
            End Set
        End Property

        <XmlElement("ElementCombo", GetType(String))> Public Property ListeCombo() As List(Of String)
            Get
                Return pListeCombo
            End Get
            Set(ByVal value As List(Of String))
                pListeCombo = value
            End Set
        End Property

        Public Property ElementSelectionne() As Integer
            Get
                Return pElementSelectionne
            End Get
            Set(ByVal value As Integer)
                pElementSelectionne = value
            End Set
        End Property
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
23 nov. 2010 à 06:13
Oups ! il manque un End Class à la fin du code précédent.

2ème chose, créer la classe qui contiendra tous les panels créés par l'utilisateur. C'est cette classe qui sera sérialisée pour l'enregistrement :

''' <summary>
    ''' Contient un ensemble de panel personnalisés
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Public Class clsListeDe_MonPanel

        Private pListeMonPanel As New List(Of clsMonPanel)

        Public Sub New()
        End Sub

        <XmlElement("MonPanel", GetType(clsMonPanel))> Public Property Items() As List(Of clsMonPanel)
            Get
                Return pListeMonPanel
            End Get
            Set(ByVal value As List(Of clsMonPanel))
                pListeMonPanel = value
            End Set
        End Property

    End Class
0

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

Posez votre question
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
23 nov. 2010 à 06:19
L'utilisateur ajoute un nouveau Panel (Click sur le bouton Ajouter :

    Private Sub btnAjouterPanel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAjouterPanel.Click
        'Créer une instance de la classe clsMonPanel
        Dim monPanel As New clsMonPanel
        'Affecter les valeurs par défaut
        With monPanel
            .ContenuLabel = "Panel n°" & (mesPanels.Items.Count + 1).ToString
            .ContenuTextBox = "Essai Textbox"
            .ListeCombo.Add("Elément 1")
            .ListeCombo.Add("Elément 2")
            .ListeCombo.Add("Elément 3")
            .ElementSelectionne = 0
        End With
        'Ajouter cette instance à la classe clsListeDe_MonPanel
        mesPanels.Items.Add(monPanel)
        'Il ne reste plus qu'à créer physiquement le nouveau Panel et à lui affecter les valeurs par défauts
        'Ca c'est ton boulot !
    End Sub
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
23 nov. 2010 à 06:35
Et au final les fonctions de chargement et d'enregistrement de la classe par sérialisation.

Il faudrait bien évidemment peaufiner le truc en récupérant avant enregistrement les valeurs modifiées dans les Panels, et, à l'inverse, créer, après le chargement, les panels pour lesquels les infos ont été stockés.

    Private Sub btnEnregistrer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnregistrer.Click
        'Serialisation XML
        Dim stream As System.IO.StreamWriter = New System.IO.StreamWriter(My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\text.xml")
        Try
            Dim serializer As New XmlSerializer(GetType(clsListeDe_MonPanel))
            serializer.Serialize(stream, mesPanels)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        Finally
            stream.Close()
        End Try
    End Sub

    Private Sub btnCharger_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCharger.Click
        'Serialisation XML
        Dim stream As System.IO.StreamReader = New System.IO.StreamReader(My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\text.xml")
        Try
            Dim deserializer As New XmlSerializer(GetType(clsListeDe_MonPanel))
            mesPanels = CType(deserializer.Deserialize(stream), clsListeDe_MonPanel)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        Finally
            stream.Close()
        End Try
    End Sub
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
23 nov. 2010 à 06:40
Dernière chose, si tu n'as pas l'habitude des fichiers XML, ouvre par curiosité le fichier Test.Xml créé par mon code (dans le dossier Documents).
Tu pourras ainsi en observer l'organisation.
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
23 nov. 2010 à 06:43
Décidément ça ne me vaut rien de me lever si tôt !

N'oublie d'importer l'espace de nom XML.Seriazition en ajoutant dans le code de ta forme, en première ligne :

Imports System.Xml.Serialization
0
neolive31 Messages postés 20 Date d'inscription lundi 12 juillet 2010 Statut Membre Dernière intervention 11 avril 2011
24 nov. 2010 à 12:15
Salut mdevaux62

pfffff... j'ai beaucoup de mal à comprendre ce que tu m'as écrit plus haut.

J'ai copier ton code sous un nouveau projet, mais "Mespanels" n'est pas déclaré donc il bug. comment dois je le déclarer ? Est ce que ça te dérangerait de m'envoyer un fichier format visual basic express 2008 que je puisse comprendre comment tout ceci ce "hierarchise" ?

Merci encore de ton aide

Neolive
0
mdevaux62 Messages postés 111 Date d'inscription dimanche 24 décembre 2000 Statut Membre Dernière intervention 17 novembre 2012 7
24 nov. 2010 à 12:45
Ci-joint le code complet de la Form.
Un copier-coller et ça devrait marcher.
Par contre, c'est toi de gérer la création des panels et le transfert des données depuis ces panels vers la classe.
Bon courage.
Public Class Form4

    Private mesPanels As New clsListeDe_MonPanel

    Private Sub btnAjouterPanel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnAjouterPanel.Click
        'Créer une instance de la classe clsMonPanel
        Dim monPanel As New clsMonPanel
        With monPanel
            .ContenuLabel = "Panel n°" & (mesPanels.Items.Count + 1).ToString
            .ContenuTextBox = "Essai Textbox"
            .ListeCombo.Add("Elément 1")
            .ListeCombo.Add("Elément 2")
            .ListeCombo.Add("Elément 3")
            .ElementSelectionne = 0
        End With
        'L'ajouter à la classe clsListeDe_MonPanel
        mesPanels.Items.Add(monPanel)
        'Il ne reste plus qu'à créer physiquement le nouveau Panel et à lui affecter les valeurs par défauts
        '
    End Sub

    Private Sub btnEnregistrer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnregistrer.Click
        'Serialisation XML
        Dim stream As System.IO.StreamWriter = New System.IO.StreamWriter(My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\text.xml")
        Try
            Dim serializer As New System.Xml.Serialization.XmlSerializer(GetType(clsListeDe_MonPanel))
            serializer.Serialize(stream, mesPanels)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        Finally
            stream.Close()
        End Try
    End Sub

    Private Sub btnCharger_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCharger.Click
        'Serialisation XML
        Dim stream As System.IO.StreamReader = New System.IO.StreamReader(My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\text.xml")
        Try
            Dim deserializer As New System.Xml.Serialization.XmlSerializer(GetType(clsListeDe_MonPanel))
            mesPanels = CType(deserializer.Deserialize(stream), clsListeDe_MonPanel)
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        Finally
            stream.Close()
        End Try
    End Sub

    ''' <summary>
    ''' Contient un ensemble de Panels personnalisés
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Public Class clsListeDe_MonPanel

        Private pListeMonPanel As New List(Of clsMonPanel)

        Public Sub New()
        End Sub

        <System.Xml.Serialization.XmlElement("MonPanel", GetType(clsMonPanel))> Public Property Items() As List(Of clsMonPanel)
            Get
                Return pListeMonPanel
            End Get
            Set(ByVal value As List(Of clsMonPanel))
                pListeMonPanel = value
            End Set
        End Property

    End Class

    ''' <summary>
    ''' Contient les éléments constituant un Panel personnalisé
    ''' </summary>
    ''' <remarks></remarks>
    <Serializable()> Public Class clsMonPanel

        Private pTextBox As String
        Private pLabel As String
        Private pListeCombo As New List(Of String)
        Private pElementSelectionne As Integer

        Public Sub New()
        End Sub

        Public Property ContenuTextBox() As String
            Get
                Return pTextBox
            End Get
            Set(ByVal value As String)
                pTextBox = value
            End Set
        End Property

        Public Property ContenuLabel() As String
            Get
                Return pLabel
            End Get
            Set(ByVal value As String)
                pLabel = value
            End Set
        End Property

        <System.Xml.Serialization.XmlElement("ElementCombo", GetType(String))> Public Property ListeCombo() As List(Of String)
            Get
                Return pListeCombo
            End Get
            Set(ByVal value As List(Of String))
                pListeCombo = value
            End Set
        End Property

        Public Property ElementSelectionne() As Integer
            Get
                Return pElementSelectionne
            End Get
            Set(ByVal value As Integer)
                pElementSelectionne = value
            End Set
        End Property

    End Class

End Class
0
neolive31 Messages postés 20 Date d'inscription lundi 12 juillet 2010 Statut Membre Dernière intervention 11 avril 2011
24 nov. 2010 à 16:16
Ben je suis vraiment désolé, mais je n'y arrive pas...

Je ne comprends pas ton code. Les ptextbox, plabel, plistecombo etc... correspondent à quoi ?

Je ne vois pas la liaison possible, en fait, entre mon code qui crée des panels et des lignes dans ses panels et ton code.

Je me suis permis de t'envoyer mon code en mp.

Peux tu m'expliquer les liaisons possibles ?

merci énormément de ton aide.

Neolive
0
Rejoignez-nous