Selon condition ecrire dans la colonne 4 suivant fichier

Résolu
trucss Messages postés 189 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 23 janvier 2024 - 13 mai 2022 à 10:07
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 - 13 mai 2022 à 17:59
Bonjour,
Avant ce code je renseigne une listviewdata
voir photo


Je dois renseigner la colonne 4:
Avec le code ci dessous si j'ai une valeur colonne 0 (test?) et colonne 2 (op?) je renseigne la colonne 4 avec le fichier CSV pour récupérer la dernière valeur après";"

test1;"op; op1; op2";;16
test2;"op3";;2
test3;"op; op1; op2; op3";;1


Dim monstreamreader As New StreamReader("T:\test.csv")
        Dim ligne As String
        Dim lastpart As String

        For i = 0 To listviewdata.Items.Count - 1

            Do
                ligne = monstreamreader.ReadLine

                If InStr(ligne, listviewdata.Items(i).SubItems(0).Text) > 0 AndAlso InStr(ligne, listviewdata.Items(i).SubItems(2).Text) > 0 Then 
                    lastpart = ligne.Substring(ligne.LastIndexOf(";") + 1) 'garde en memoire le numero 
                End If

            Loop Until ligne Is Nothing

            With listviewdata.Items(i)

                If .SubItems(2).Text <> String.Empty AndAlso .SubItems(0).Text <> String.Empty Then
                    .SubItems(4).Text = lastpart ' écrire dans la quatrième colonne

                End If
            End With
        Next

3 réponses

vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
Modifié le 13 mai 2022 à 15:53
Bonjour
Quel est le souci ?
De plus à un post précédent Whismeril t'a dit qu'utiliser un StreamReader pour lire un simple fichier texte c'est l'artillerie lourde . La méthode ReadAllLines de la classe File ferait très bien l'affaire .
Que veux tu faire exactement avec InStr ( qui en passant est un mot clé VB 6 ) ?
De plus ta ListView ne doit servir qu'à l'affichage des données . Or on voit dans ton code tu t'en sers pour faire des tests sur des valeurs de ces cellules .

0
trucss Messages postés 189 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 23 janvier 2024 1
Modifié le 13 mai 2022 à 16:44
Oui j'ai pas encore modifié pour le streamreader
Je voudrais vérifier si on a sur la même ligne du fichier a chaque lecture les 2 valeurs qu'on lit colonne 0 et colonne 2 et si oui on va récupérer la dernière valeur de la ligne du fichier et l'écrire colonne 4. Ca me rempli la colonne mais toujours avec la meme valeur sur toute les lignes.
Le InStr je m'en sert pour cherche les mots dans la ligne du fichier
0
trucss Messages postés 189 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 23 janvier 2024 1 > trucss Messages postés 189 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 23 janvier 2024
13 mai 2022 à 17:03
J'ai l'impression qu'une fois que j'ai lu tout le fichier pour la prochaine lecture ça repart pas du début du fichier
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169
13 mai 2022 à 17:03
Bonjour
Teste ceci
Dim Subitem0, Subitem2 as string ' les 2 éléments de la Listview à retrouver dans le fichier
Dim Lignes as List(of String) = File.ReadAllLines("T:\test.csv"). ToList ' les lignes du fichier
Dim TableStrings() as String ' les éléments splittés d'une ligne du fichier
For i = 0 to listviewdata.Items.Count - 1
    TableStrings = Lignes(i).Split(";") ' les différents élémens d'une ligne du fichier
    With listviewdata.Items(i)
          Subitem0 = .Subitems(0).Text ' colonne 0 de la listview
          Subitem2 = .Subitems(2).Text ' colonne 2  de la listview
          If TableStrings(0) = Subitem0 AndAlso TableStrings(2) = Subitems2 then
               ' si les 2 sont égaux on écrit colonne 4 le dernier élément de la ligne
              .Subitems(4).Text = Lignes(i).Substring(Lignes(i).LastIndexOf(";") + 1)
          End if
   End with
nexr 


Remarque les commentaires que j'ai mis . Ils rendent le code bien plus compréhensible

0
trucss Messages postés 189 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 23 janvier 2024 1
13 mai 2022 à 17:07
j'ai erreur sur subitem non declaré
0
vb95 Messages postés 3472 Date d'inscription samedi 11 janvier 2014 Statut Contributeur Dernière intervention 13 avril 2024 169 > trucss Messages postés 189 Date d'inscription jeudi 17 février 2022 Statut Membre Dernière intervention 23 janvier 2024
Modifié le 13 mai 2022 à 18:08
Bonjour
Au message précédent tu dis avoir une erreur .
Est ce dans le code que je t'ai présenté au message 3 ? Si oui a quelle ligne ?
Autre chose : combien de colonnes a ta Listview ? Exemple : si ta Listview a 5 colonnes elles sont numérotées de 0 à 4 .
De plus le post est mis en résolu : l'erreur a-t-elle été corrigée ?
En plus raisonnons un peu : tu compares 2 colonnes de la listview avec 2 éléments d'une ligne d'un fichier .
Avec quoi est remplie la listview ?
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 656
13 mai 2022 à 17:59
Bonjour

tu dis que tu as une erreur et en même temps tu as marqué ton sujet résolu.
Donc résolu ou pas?
Si pas, "démarque" le sujet au moins c'est clair.

Si tu nous expliquais le besoin et pas la solution technique que tu envisages.
Parce que, si je comprends bien le code de ton message initial de ce fil, tu commences pas une erreur de conception.
Ta listview semble servir de "base de données" données que tu viens modifier.
Ça ne sert pas à ça, ça sert à afficher les données.
Pour la source de données, il y a des collections d'objets bien plus faciles à manipuler et dont c'est la raison d'être.

En plus, en ce qui me concerne, en Winform, je trouve que les listView ne sont un bon contrôle quand il s'agit de données "pures", du texte, des nombres, des dates etc... pas d'images. Car ce contrôle ne permet pas le binding, et le binding c'est l'intérêt principal de choisir .Net par rapport à d'autres langages. Et pour ça, selon le cas le datagriview ou la listbox sont 2 solutions parfaites.

Le seul cas, à mon sens, où il faut utiliser des listview en Winform, c'est quand on veut associer données "pures" et images sur l'interface.

Par contre, la listview de WPF, c'est du bonheur....

0
Rejoignez-nous