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
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
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
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
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
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
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
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
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
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.
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)
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 )
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
9 déc. 2016 à 20:30
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
10 déc. 2016 à 13:42
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 :
Modifié par cs_Le Pivert le 10/12/2016 à 16:29
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 :
Bonne programmation
@+ Le Pivert
10 déc. 2016 à 17:55
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 :
je place et dans la Form1
et je met :
dans la Form1 :
dans la form2 :
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?
10 déc. 2016 à 18:19
Mettre ceci dans un module:
Ensuite pour appeler dans les 2 Form:
voilà