Problème rafraichissement listview [Résolu]

Signaler
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020
-
Messages postés
2155
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
26 mai 2020
-
Salut à tous,

Je fais une listview que j'alimente avec une boucle for each.

J'ai un bouton qui me permet de dupliquer un élément de cette listview.

Je duplique, tout va bien, mais quand je vais ensuite rafraichir la listview, tout disparait et rien ne s'affiche.

Je vous montre mon code, j'ai essayé de le détailler au mieux :

 If Me.ListView1.FocusedItem IsNot Nothing Then

            Dim appPath As String = Application.StartupPath() & "\SVG"
            Dim Fichiers_SVG = My.Computer.FileSystem.GetFiles(appPath, FileIO.SearchOption.SearchTopLevelOnly, "*.cas")
            Dim Fichier_A_Copier As String = Me.ListView1.SelectedItems.Item(0).Text
            Dim Nom_Fichier As String

            'Séparation de l'extension
            Dim sep() As Char = "."
            Nom_Fichier = (Fichier_A_Copier).Split(sep).First

            'Définition du fichier dupliqué
            Dim Fichier_Duplique As String = appPath & "\" & Nom_Fichier & "_Copie.cas"

            'Copie du fichier
            IO.File.Copy(appPath & "\" & Fichier_A_Copier, Fichier_Duplique)

            'Ouverture du chemin pour contrôle
            Process.Start(appPath)

            'Nettoyage de la liste
            ListView1.Clear()

            'Pour chaque fichier contenu dans le dossier SVG, le mettre dans la listview avec la date de creation et la premiere ligne
            For Each fichier As String In Fichiers_SVG

                With ListView1

                    Dim Element As New ListViewItem
                    Dim FichierInfo As FileInfo = New FileInfo(fichier)
                    Dim Date_creation As Date = FichierInfo.CreationTime.Date

                    'Récupération de la première ligne du fichier
                    Dim STR As New StreamReader(fichier)
                    Dim PremiereLigne As String
                    PremiereLigne = STR.ReadLine

                    'Construction de la ligne dans le listview
                    Element.Text = Dir(fichier)
                    Element.SubItems.Add(Date_creation)
                    Element.SubItems.Add(PremiereLigne)

                    'On envoie les données dans le listview
                    .Items.Add(Element)

                End With

            Next

        End If


Auriez-vous une idée ?

Merci.

18 réponses

Messages postés
2155
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
26 mai 2020
109
Bonjour
Pour le nom de fichier sans l'extension utilises ceci
Dim Nom_Fichier as String = System.IO.Path.GetFileNameWithoutExtension(Fichier_A_Copier)


Pour ta boucle For Each fais ainsi
For Each fichier As String In Fichiers_SVG
       Dim FichierInfo As FileInfo = New FileInfo(fichier)
        Dim Date_Creation As Date = FichierInfo.CreationTime.Date
        ' on crée le StreamReader pour lire la première ligne du fichier
        Dim STR As New StreamReader(fichier)
        ' on crée l'item de la listview et on l'ajoute
        ListView1.Items.Add(New ListViewItem(New  String() {Dir(fichier), Date_Creation.ToString, STR.ReadLine}))
        ' on ferme le StreamReader
        STR.Close()
Next



Par contre j'ai un doute sur le
Dir(fichier)

C'est du VB 6 et je ne vois pas son utilité ;
C'est le nom du fichier complet que tu veux là ?

Messages postés
2155
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
26 mai 2020
109
Bonjour
en regardant les propriétés de ta listview est-elle en mode Detail pour la propriétés View ?

Messages postés
2155
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
26 mai 2020
109
Et dans le paramètre Columns as-tu bien tes 3 colonnes ?
Car je n'en vois aucune sur l'image que tu as mise ?
Messages postés
2155
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
26 mai 2020
109
De ce côté là tout est bon !
As -tu mis la propriété FullRowSelect à True pour ta Listview
A quoi sert cette ligne avec le If ?
If Me.ListView1.FocusedItem IsNot Nothing Then

Vérifie en pas à pas si tu rentres bien dans la condition IF et que le code dans cette condition s'exécute .
Messages postés
2155
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
26 mai 2020
109
Pour tester si l'utilisateur a bien sélectionné une ligne de la listview utilises l'évènement Click de la ListView
un exemple ici
Private Sub Listfich_Click(sender As Object, e As EventArgs) Handles Listfich.Click

        Dim LigneSelectionnee as Integerl = Listfich.SelectedIndices(0)
        
End Sub

Tu peux récupérer le n° de ligne sélectionnée
Messages postés
2155
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
26 mai 2020
109
Changer la vue ne solutionnera point ton problème
Pose un point d' arrêt sur la ligne
For Each fichier As String In Fichiers_SVG
et regarde si Fichiers_SVG contient quelque chose .
Tu dis : Ok, je viens de squeezer tous les IF, cela ne fonctionne toujours pas
Cela veut dire quoi ?
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

J'ai enlevé tous les IF, désolé je reprends, je te tiens au courant
Messages postés
2155
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
26 mai 2020
109
Rebonjour
Je n'avais pas fait attention :
Listview1.Clear()
efface toutes les propriétés de la Listview alorsd que
Listview1.Items.Clear()
ne fait qu'effacer les items de la listview ( soit son contenu )
Si je comprends bien c'est le
Fichier_Duplique
qui te manque : logique car
Fichiers_SVG
ne le contient pas au départ .

Quelques conseils :
Clicque dans les propriétés du projet ( voir menu projet ) et dans la nouvelle interface qui s'affiche va dans Compiler .
Là tu mets Option Strict et Option Explicit sur On ( cela t'obligera à déclarer toutes tes variables avec une clause As ) .
Ensuite tu vas dans dans References . Dans la liste en bas tu décoches Microsoft Visual Basic : tu feras ainsi du vrai VB Net sans y mettre des instructions VB6 ( Microsoft les a laissé par souci de compatibilité et pour ne pas perdre les développeurs VB 6 : si on fait du VB Net autant le faire à fond )
Ces conseils sont valables pour tous projets en VB Net

Ensuite un excellent cours VB Net pour les bases : https://plasserre.developpez.com/cours/vb-net


Messages postés
2155
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
26 mai 2020
109
Le fichier dupliqué est facile à rajouté :
Juste avant la boucle
For Each
tu mets
Fichiers_SVG = My.Computer.FileSystem.GetFiles(appPath, FileIO.SearchOption.SearchTopLevelOnly, "*.cas")

Par contre ton fichier dupliqué n'a pas d'extension .cas : il faut modifié une ligne ainsi
'Copie du fichier
IO.File.Copy(appPath & "\" & Fichier_A_Copier, Fichier_Duplique & ".cas")

Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

Bonjour et merci beaucoup,

Alors, j'ai essayé le code que tu as mis, qui est beaucoup plus propre que ce que j'avais fait.

Maintenant, j'ai toujours la même erreur.

Regarde :


Je ne sais pas pourquoi les colonnes disparaissent ...

Concernant le Dir(fichier), cela me permet de prendre uniquement le fichier avec l'extension, et c'est fonctionnel avec vb.net.

Je continue à chercher ;)
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

Merci,

Effectivement, j'ai ce paramètre.
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

Merci !

Voici une capture peut-être plus explicite :

Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

Cette ligne me permet de valider si l'utilisateur a bien sélectionné une ligne dans le Listview.
Je vais essayer de désactiver les IF en amont pour voir s'il y a pas un problème.
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

Ok, je viens de squeezer tous les IF, cela ne fonctionne toujours pas.
J'ai essayé de changer la vue, en passant en LargeIcons, les icônes restent, mais rien ne s'actualise.

J'aime bien l'idée du SelectedIndices, je me penche là dessus.
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

Alors, j'ai tout désactivé jusqu'à la boucle et rien n'y fait; je pense que mon problème vient du Listview, je repars avec un vierge pour voir.
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

Bon, il y a du nouveau, j'ai creusé un peu dans les options de la ListView, puisque lorsque j'en créais une nouvelle, il n'y a rien qui changeait.

J'ai pu arriver à garder les colonnes et le contenu initial en faisant :

'Nettoyage de la liste
ListView1.Items.Clear()


En lieu et place de :

'Nettoyage de la liste
ListView1.Clear()


Maintenant, je n'ai toujours pas la dernière ligne qui s'affiche ...
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

OK, donc je comprends bien, je suis obligé de l'ajouter à la liste initiale.
Je cherche ;) Merci !
Messages postés
40
Date d'inscription
mardi 17 mars 2020
Statut
Membre
Dernière intervention
10 avril 2020

J'y étais presque, je me suis embarqué trop loin pour faire un code clair je pense.
Je n'ai pas rajouté l'extension, cela me faisait un doublon.

Merci beaucoup pour ton aide !
Messages postés
2155
Date d'inscription
samedi 11 janvier 2014
Statut
Contributeur
Dernière intervention
26 mai 2020
109
De rien !