Enregistrer les données d'une ListView (My.settings) [Résolu]

Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 9 déc. 2016 à 18:48 - Dernière réponse : vb95 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention
- 11 déc. 2016 à 01:04
Bonsoir,
Je veux enregistrer les données Ajouter dans une ListView dans l'application en utilisant My.settings
j'ai pu trouver le code utiliser pour la TexteBox et la ListBox
Pour la listeBox on a besoin de :
une ListBox
Une TexteBox
Deux Bouton

Ajouter une variable dans les propriétés du Projet -> Paramètres -> Nom : ListView1 et Type : System.Collections.ArrayList
On ajoute le code suivant :
 Dim list As New ArrayList()
'Remplir la ListBox
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
list.Add(TextBox1.Text)
TextBox1.Clear()
TextBox1.Focus()
ListBox1.DataSource = list.ToArray().ToList()
End Sub
'Enregistrer les Données dans la Source
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
My.Settings.ListBox1 = list
My.Settings.Save()
End Sub

Pour la TextBox on a besoin de :
Sans Code :
Une TexteBox
Dans la propriété de La TexteBox -> (ApplicationSettings) -> (PropertyBinding) -> Text -> Nouveau -> Name : Par exemple "Save"
Avec Code :
Une TexteBox
Deux Boutons
Ajouter une variable dans les propriétés du Projet -> Paramètres -> Nom : Saves et Type : String
Ajouter le code Suivant :
 'Bouton Sauvgarder les données
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
My.Settings.Saves = TextBox1.Text
My.Settings.Save()
End Sub
'Bouton Afficher les données sauvgarder
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
TextBox1.Text = My.Settings.Saves
End Sub

Mais j'ai beau chercher je ne trouve rien concernant la ListView
j'ai trouvé beaucoup de poste concernant ce Sujet, mais soit qu'il y a pas de solution, soit une solution qui ne me convient pas
Remarque : je veux éviter d'enregistrer les données dans un document texte ( je connais cette méthode)
je vous remercie d'avance pour votre aide
Afficher la suite 

15 réponses

Répondre au sujet
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - Modifié par cs_Le Pivert le 9/12/2016 à 19:13
+1
Utile
8
Bonjour,

voici une réponse de notre ami Banana32

http://codes-sources.commentcamarche.net/forum/affich-1614143-enregistrer-une-listbox1-completement-avec-my-settings?page=2#25

ne te fis pas au titre, c'est le dernier message

c'est dans un fichier texte, je cherche si je n'ai pas autre chose dans mes archives


@+ Le Pivert
Cette réponse vous a-t-elle aidé ?  
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention > cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 10 déc. 2016 à 17:55
Bonsoir cs_Le Pivert,
Merci beaucoup c'est exactement ce que j'ai voulu
et c'est beaucoup mieux que la méthode a laquelle j'ai pensé, je voulais mettre deux ListBox (j'ai deux colonne dans la ListView) et utiliser le code que j'ai posté plus haut, au démarrage de la Form les données seront rempli dans les deux ListBox après importer les données de deux ListBox vers la ListeView
juste une chose, la ListView est dans la Form2 et je veux utiliser les données enregistrées dans la ListView dès le démarrage de la Form1, je sais que pour utiliser un variable dans plusieurs Form On remplace "Dim" par "Public", alors je dois faire comme suite :
 Public tmpContenu As String = ""
Public Lignes As String()
Public Cells As String()
Public incr As Integer
Public Items As ListViewItem()

je place
Private Sub Loadlistview
et
Private Sub Savelistview
dans la Form1
et je met :
dans la Form1 :
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Loadlistview()
End Sub

dans la form2 :
 Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Loadlistview()
End Sub
Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Savelistview()
End Sub

cela devrait remplir la ListView qui est dans la Form2 dès le démarrage de la Form1 pour pouvoir utiliser les données et à chaque fois que j'ouvre la Form2 la LlistView sera rempli avec les nouvelles données et à la fermeture de la Form2 les données seront enregistrés
est-ce que je dois aussi faire ça?
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Savelistview()
End Sub
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention > Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 10 déc. 2016 à 18:19
Il faut tout revoir:

Mettre ceci dans un module:

Option Strict On
Imports System.Text.RegularExpressions
Module Module1
    Public Sub Savelistview(ByVal list As ListView)
        'Déclare la chaîne temporaire qui servira à enregistrer le contenu du tableau
        Dim tmpContenu As String = ""

        'On va maintenant construire la même chose qu'un fichier .csv :
        '   - Chaque ligne est séparée par le caractère VbLf
        '   -Les données de chaque ligne sont séparées par le caractère ";"

        'Prend chacune des lignes de la ListView
        For Each I As ListViewItem In list.Items

            'Prend chaque sous-élément de l'item actuel
            For Each SI As ListViewItem.ListViewSubItem In I.SubItems

                'Ajoute la valeur du subitem à la string représentant le tableau (avec le ";" pour séparer les valeurs)
                tmpContenu = tmpContenu & SI.Text & ";"

            Next

            'Ajoute le caractère VbLf à la string représentant le tableau
            tmpContenu = tmpContenu & Environment.NewLine

        Next

        'Retire de la chaîne de la String le ";" excédentaire de chaque ligne
        tmpContenu = tmpContenu.Replace(";" & Environment.NewLine, Environment.NewLine)

        'Enregistre maintenant cette String dans tes settings
        My.Settings("malistview") = tmpContenu
    End Sub
    Public Sub Loadlistview(ByVal list As ListView)
        Dim tmpContenu As String
        Dim Lignes As String()
        Dim Cells As String()
        Dim incr As Integer
        Dim Items As ListViewItem()
        With list
            .View = View.Details
            .GridLines = True
            .FullRowSelect = True
            .CheckBoxes = True 'affiche les cases à cocher
            .Columns.Add("Fichiers", 150, HorizontalAlignment.Left)
            .Columns.Add("Date création", 120, HorizontalAlignment.Left)
            .Columns.Add("Dernière Modification", 120, HorizontalAlignment.Left)
        End With
        'Récupère le tableau dans les settings
        tmpContenu = CStr(My.Settings("malistview"))

        'Divise la String en autant de lignes qu'il y en a (séparées par les VbLf)
        'Attention , comme dans la construction le dernier caractère est VbLf on va se retrouver avec une ligne en trop dont il ne faudra pas tenir compte

        Lignes = Regex.Split(tmpContenu, Environment.NewLine)

        'Indique le nombre d'items que l'on va ajouter à la ListView
        ReDim Items(Lignes.GetUpperBound(0) - 1) '-1 car il y a une ligne vide en trop dans le fichier

        'Ajoute chaque ligne dans le tableau de données
        For incr = 0 To Lignes.GetUpperBound(0) - 1

            'Divise la ligne en autant de données qu'elle en contient (séparées par des ";")
            Cells = Regex.Split(Lignes(incr), ";")

            'Ajoute la ligne à la liste des lignes à ajouter
            Items(incr) = New ListViewItem(Cells)

        Next

        'Ajoute l'ensemble des lignes à la ListView
        list.Items.AddRange(Items)

    End Sub
End Module


Ensuite pour appeler dans les 2 Form:

  Loadlistview(ListView1)

Savelistview(ListView1)


voilà
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention > cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 10 déc. 2016 à 19:35
Bonsoir cs_Le Pivert,
Désolé de te déranger encore une fois
je fais comme tu as demandé
j'ai copier ton code dans un nouveau module
dans la Form1 j'ai mets deux Textbox et deux Bouton
Voici le code de la Form1 :
 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Loadlistview(Form2.ListView1)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Form2.Show()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
TextBox1.Text = Form2.ListView1.Items(1).Text
End Sub

Dans la Form2 j'ai mets deux Rextbox, une ListView (Avec deux Colonnes) et un Bouton
Voici le code de la Form2 :
 Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
ListView1.Items.Clear()
Loadlistview(ListView1)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
ListView1.Items.Add(New ListViewItem({TextBox1.Text, TextBox2.Text}))
End Sub
Private Sub Form2_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Savelistview(ListView1)
End Sub

Je démarre l'application, je clique sur le Bouton2 pour ouvrir la Form2
Je rempli la ListView et je la ferme après (Je la réouvre pour vérifier si les données sont bien enregistrées)
Quand je clique sur le Bouton1 pour afficher par exemple le contenu de l'item1 il affiche l'erreur suivante "La valeur '1' n'est pas valide pour 'index'."
je suis désolé, j'essaye vraiment de savoir ou se trouve mon erreur, mais je ne y'arrive pas
cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention > Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 10 déc. 2016 à 19:52
C'est tu veux que cela fonctionne il faut que ton Form 2 soit ouvert et la listview remplie, c'est un minimum!

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
        Form2.Show()
        TextBox1.Text = Form2.ListView1.Items(1).Text
    End Sub
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention > cs_Le Pivert 5065 Messages postés jeudi 13 septembre 2007Date d'inscriptionContributeurStatut 13 avril 2018 Dernière intervention - 10 déc. 2016 à 21:08
Bonsoir cs_Le Pivert,
merci infiniment, ça fonctionne très bien
il me reste plus que je cherche un moyen de faire la même chose pour une ImageList si c'est possible bien sûr et mon projet sera terminé
je n'ai pas encore fait des recherches sur ce sujet, je ne peux pas juste poser une question ici et attendre une solution il faut que je fasse un minimum d'effort
Commenter la réponse de cs_Le Pivert
vb95 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - Modifié par vb95 le 9/12/2016 à 19:18
0
Utile
4
bonsoir Karin.code

My.Setting sert en VB Net à stocker des paramètres liées à l'application et non des données liées à l'application
En plus de 15 ans de Vb ( VB 6 et VB Net) je n'ai jamais eu à m'en servir . De plus on le voit très très rarement ( pour ne pas dire jamais ) utilisé dans les codes proposés sur le site !
Je te recommande plutôt le bon fichier Texte ( il a fait ses preuves et correspond bien plus au but recherché)
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi. 
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 9 déc. 2016 à 20:42
Bonsoir vb95,
merci pour ta réponse
tu a dit que My.Settings n'enregistre pas les données alors ça doit être la même chose pour la ListBox, mais avec le code que j'ai posté plus haut les données de la ListBox sont enregistrés en utilisant My.Setting non?
Ps:je me Trompe peut-être, ça ne fait même pas 1 ans que j'ai commencé le langage Vb.Net, il y a une grand différence entre nos connaissances dans le langage Vb.net)
vb95 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention > Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 9 déc. 2016 à 21:25
Bonsoir Karin.code
Je ne t'ai jamais dit que My.settings ne pouvait pas enregistrer des données
Imagine une application quelconque avec une couleur de fonds pour l'application . Cette couleur de fonds tu peux la choisir ! toi tu préfères bleu ciel et moi turquoise ! Chacun de nous enregistre cette couleur de fonds avec My.Settings et lorsque nous ouvrons de nouveau l'application le lendemain chacun de nous a sa couleur préférée
C'est tout ce qui fait la différence entre un paramètre de l'application ( la couleur de fonds) et les données de l'application ( le contenu de la listview)
De plus une listbox n'a en principe qu'une seule véritable colonne alors qu'une listview peut en avoir plusieurs et là c'est pas évident de stocker tout ceci avec My.Settings
il faut utiliser les outils de Vb Net pour ce à quoi ils ont été destinés ( rappel avec ton sujet sur les MenuStrip )
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention > vb95 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention - 10 déc. 2016 à 17:53
Bonsoir Vb95,
Désolé je n'ai pas bien compris ton explication plus haut
et de plus tu viens juste de me donner une idée pour un autre projet
Merci
vb95 1501 Messages postés samedi 11 janvier 2014Date d'inscriptionContributeurStatut 19 avril 2018 Dernière intervention > Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 11 déc. 2016 à 01:04
bonsoir Karin.code
Pour reprendre ce que je disais plus haut suppose que l'application soit un carnet d'adresses . toi tu préfères un fonds bleu ciel et moi un fond turquoise : ça c'est un paramètre de l'application ; Par contre la listview qui va contenir nos contacts ça ce sont des données de l'application .
De plus tu utilises le contenu de ta listview comme données : or un contrôle textbox, listbox, listview, etc.... est fait pour afficher des données ( ces mêmes données étant elles dans des variables organisées en tableau ou list(of)) . Ton code aurait été bien plus clair et moins lourd en utilisant directement ces tableaux ou list(of) plutôt que le contenu de la listview
Commenter la réponse de vb95
Karin.code 183 Messages postés vendredi 2 septembre 2016Date d'inscription 16 janvier 2018 Dernière intervention - 10 déc. 2016 à 21:10
0
Utile
Merci infiniment à cs_Le Pivert et Vb95 de m'avoir aidée à résoudre ce sujet
Commenter la réponse de Karin.code

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.