Enregistrer les données d'une ListView (My.settings)

Résolu
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 - Modifié par Karin.code le 9/12/2016 à 19:04
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 - 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

3 réponses

cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
Modifié par cs_Le Pivert le 9/12/2016 à 19:13
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
1
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
9 déc. 2016 à 20:30
Bonsoir cs_Le Pivert,
Merci
C'est une bonne méthode je vais l'utiliser pour l'instant, si tu trouve quelque chose sur ce que j'ai mentionné plus haut tiens moi au courant s'il te plait
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
10 déc. 2016 à 13:42
Voilà la suite trouvé ici:

http://www.developpez.net/forums/d952917-2/dotnet/langages/vb-net/sauvegarder-valeurs-d-listview-my-settings/

Ajouter une variable dans les propriétés du Projet -> Paramètres -> Nom : malistview et Type : String
Ajouter le code Suivant :

 'http://www.developpez.net/forums/d952917-2/dotnet/langages/vb-net/sauvegarder-valeurs-d-listview-my-settings/
    'enrgistrer listview
    Private Sub Savelistview()
        '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 ListView1.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 & vbLf

        Next

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

        'Enregistre maintenant cette String dans tes settings
        My.Settings("malistview") = tmpContenu
    End Sub
 
    Private Sub Loadlistview()
       Dim tmpContenu As String
        Dim Lignes As String()
        Dim Cells As String()
        Dim incr As Integer
        Dim Items As ListViewItem()

        '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 = Split(tmpContenu, vbLf)

        '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 = Split(Lignes(incr), ";")

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

        Next

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

    End Sub
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137
Modifié par cs_Le Pivert le 10/12/2016 à 16:29
Voici un bonus:

mettre dans un Form
1 listview nommée : ListView1
1 button nommé: cmdopen
1 label nommé: lblfile
Ajouter une variable dans les propriétés du Projet -> Paramètres -> Nom : malistview et Type : String
Ajouter le code Suivant :

Option Strict On
Imports System.IO
Imports System.Text.RegularExpressions
Public Class Form1
    Dim chemin As String
    Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        Savelistview()
    End Sub
    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        Loadlistview()
    End Sub
    Private Sub cmdopen_Click(sender As System.Object, e As System.EventArgs) Handles cmdopen.Click
        'boite dialogue de choix dossier source
        Dim opendir As New FolderBrowserDialog
        With opendir
            .SelectedPath = chemin
            .ShowNewFolderButton = True
            If .ShowDialog = Windows.Forms.DialogResult.OK Then
                chemin = "" & .SelectedPath 'chemin du fichier source
               Me.ListView1.Columns.Clear()
               Me.ListView1.Items.Clear()
                comparefile()
            Else
                MessageBox.Show("Opération annulée par l'utilisateur!", "Ouverture dossier", MessageBoxButtons.OK, MessageBoxIcon.Information)
                Exit Sub
            End If
            .Dispose()
        End With
    End Sub

'http://www.developpez.net/forums/d952917-2/dotnet/langages/vb-net/sauvegarder-valeurs-d-listview-my-settings/
 
    Private Sub Savelistview()
        '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 ListView1.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

    Private Sub Loadlistview()
        Dim tmpContenu As String
        Dim Lignes As String()
        Dim Cells As String()
        Dim incr As Integer
        Dim Items As ListViewItem()
        With Me.ListView1
            .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
        ListView1.Items.AddRange(Items)
        lblfile.Text = CStr(ListView1.Items.Count) & " fichiers"
    End Sub
    'Fichiers
    Private Sub comparefile()
        Try
            'get file infos
            Dim d1 As New DirectoryInfo(chemin)
            Dim aInfos() As FileInfo = d1.GetFiles
            Dim i As Integer

            With Me.ListView1
                .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
            'ListView
            For Each info As FileInfo In aInfos
                i = i + 1
                Dim lvi As New ListViewItem(info.Name)
                With lvi
                    .Name = info.Name
                    .SubItems.Add(info.CreationTime.ToString)
                    .SubItems.Add(info.LastWriteTime.ToString)
                    .Tag = info
                End With

                Me.ListView1.Items.Add(lvi)
                lblfile.Text = CStr(ListView1.Items.Count) & " fichiers"
            Next
        Catch
        End Try
    End Sub
End Class


Bonne programmation

@+ Le Pivert
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2 > cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024
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
0
cs_Le Pivert Messages postés 7903 Date d'inscription jeudi 13 septembre 2007 Statut Contributeur Dernière intervention 11 mars 2024 137 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
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à
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié par vb95 le 9/12/2016 à 19:18
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. 
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
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)
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
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 )
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2 > vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024
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
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018
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
0
Karin.code Messages postés 183 Date d'inscription vendredi 2 septembre 2016 Statut Membre Dernière intervention 16 janvier 2018 2
10 déc. 2016 à 21:10
Merci infiniment à cs_Le Pivert et Vb95 de m'avoir aidée à résoudre ce sujet
0
Rejoignez-nous