ListView: problême pour sauvegarder

Résolu
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 - 28 mars 2007 à 15:52
 gregwillm - 24 juil. 2007 à 21:38
Salut, j'ai un problême avec le code ci-dessous:

        Dim Dates As String
        Dim i As Integer
        For i = 0 To ListView1.Items.Count + 10
            Dates = Dates & ListView1.Items(i).SubItems(0).Text & "|" & ListView1.Items(i).SubItems(1).Text & "|" & ListView1.Items(i).SubItems(2).Text & "|" & ListView1.Items(i).SubItems(3).Text & "|" & ListView1.Items(i).SubItems(4).Text & "|" & ListView1.Items(i).SubItems(5).Text & "|" & ListView1.Items(i).SubItems(6).Text & "|" & ListView1.Items(i).SubItems(7).Text & "|" & ListView1.Items(i).SubItems(8).Text & "|" & ListView1.Items(i).SubItems(9).Text & vbCrLf
        Next i
        FileOpen(1, path & "" & nom & "" & "\Gestion\sto.gcc", OpenMode.Binary)
        FilePut(1, Dates)
        FileClose(1)

Ce que j'ai mis en rouge, c'est ou j'ai le bugs, j'explique:
Je veux sauvegarder le contenu d'un ListView qui a 10 colonnes. Arrivé à la ligne en rouge, il me dit "InvalidArgument=La valeur '1' n'est pas valide pour 'index'"
Je voix pas trop ou est le bug dans cette ligne.

Merci d'avance

Bye

ebaudoux@club.fr

28 réponses

cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
28 mars 2007 à 22:20
Par exemple :

-------------------------------------------------------------------------------------
| colonne 1        | colonne 2          | colonne 3            | colonne 4         | colonne 5     |
-------------------------------------------------------------------------------------
| xxxxxxxxx       |   xxxxxxxxx       |  xxxxxxxxxx        |                         |                     | colonne 4 et 5 vont générer une erreur car elles sont vides
-------------------------------------------------------------------------------------
| yyyyyyyyyyyy  |  yyyyyyyy         |  yyyyyyyyyyy       |   yyyyyyyyy      |  yyyyyyyyyy |
-------------------------------------------------------------------------------------

Est ce que tu as une listview de ce genre là ?
3
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
28 mars 2007 à 22:26
En faite ca vient du fait que les colonnes vides provoquent des erreurs avec le code que je t'ai proposé l'astuce serait que tu mettes un espace dans chaque colonne vide. Comme ca, on croit toujours qu'elles sont vides mais en réalité, non et mon code ne t'embêteras plus car elles auront un caractère

Tiens moi au courant @+
3
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
28 mars 2007 à 16:13
Salut,



SubItems(0)
et ainsi dessuite




A+
Exploreur


 
0
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
28 mars 2007 à 16:23
Salut, merci, il ne dit plus qu'il y a des bugs mais aintenant, dans le fichier ou c'est enregistré, il ne me met que le contenu de la première colonne. C'est surment du fait qu'il ne fait qu'écrire le item 0, mais sinon, sa fait des bugs... pffffffff

Merci d'avance

Bye

ebaudoux@club.fr

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
28 mars 2007 à 16:29
Salut,


Il ne faut pas que faire une boucle sur tes items, mais aussi sur les subitems...

A+
Exploreur


 
0
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
28 mars 2007 à 16:33
Tu veux dire que dans le for_next, pour l'item, mettre un for_next pour prendre le texte de chaque colonne?
Dit moi si c'est sa ou pas, pendant ce temps, je vais essayer sa.

ebaudoux@club.fr

0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
28 mars 2007 à 16:35
Salut,


Voici un petit exemple pour une listview à 12 colonnes:
' on parcoure toutes les lignes
 For I = 1 To ListView1.ListItems.Count
     ' On parcoure les colonnes (on sait qu'il y en a douze (moins la première)
      For J = 1 To 11
       ' Verife
        Msgbox ListView1.ListItems(I).SubItems(J)
    Next J
 Next I


A+
Exploreur


 
0
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
28 mars 2007 à 17:02
Euh, toujours le même bugs:

        Dim dates As String
        Dim i As Integer
        Dim J As Integer
        ' on parcoure toutes les lignes
        For i = 0 To ListView1.Items.Count
            ' On parcoure les colonnes (on sait qu'il y en a douze (moins la première)
            For J = 0 To 9
                ' Verife
                Dates = ListView1.Items(i).SubItems(J).Text & "|"
            Next J
        Next i
        FileOpen(1, path & "" & nom & "" & "\Gestion\sto.gcc", OpenMode.Binary)
        FilePut(1, Dates)
        FileClose(1)

Dans le premier FOR, le ListItems, sa existait pas et à par se, toujours le même bugs

ebaudoux@club.fr

0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
28 mars 2007 à 17:03
Salut,


J'ai un doute concernant le saut de ligne, mais essaye cela :


Dim Dates As String
Dim i As Integer
Dim j As interger


' Chemin fichier et ouverture
 FileOpen(1, path & "" & nom & "" & "\Gestion\sto.gcc", OpenMode.Binary)


' on parcoure donc toutes les lignes
For i = 0 To ListView1.Items.Count 

  ' On met dans Dates l'item de la première colonne
   Dates = ListView1.ListItems(i).text & vbTab ' ici un espace

  ' on parcoure toutes les colonnes
   For j = 1 to 9
      ' On rempli ta variable
        Dates = Dates & ListView1.ListItems(i).SubItems(J) & vbTab 'ici un espace
   Next j
 
  ' on ecrit dans le fichier dés qu'une ligne est terminées
    FilePut(1, Dates) & VbNewLine ' Saut de ligne


Next i


  ' Une fois tout fini, ferme fichier
   FileClose(1)


A+
Exploreur


 
0
cs_Exploreur Messages postés 4821 Date d'inscription lundi 11 novembre 2002 Statut Membre Dernière intervention 15 novembre 2016 15
28 mars 2007 à 17:06
Salut,


Bien sûr à adapter en .net, excuse me...


A+
Exploreur


 
0
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
28 mars 2007 à 17:13
pfffffffffff, pareil. Et je répète que ListItmes n'est pas correcte. Euh, je ne l'ai pas encore dit, je suis en VB.net

ebaudoux@club.fr

0
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
28 mars 2007 à 17:14
Mrd, l'adapter en VB.net, y a pas de prob, mais bon, toujours le même bugs

ebaudoux@club.fr

0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
28 mars 2007 à 20:59
Salut,

Essaies ceci pour enregistrer  (PS : Ajouter Imports System.IO avant Public Class Form1) :

Dim SaveFileDialog1 As SaveFileDialog
Dim reponse As DialogResult
Dim Save_Listview As String = ""

SaveFileDialog1.InitialDirectory = My.Application.Info.DirectoryPath + "\" ' Définit le répertoire de démarrage
SaveFileDialog1.FileName = ""   ' Permet de mettre une chaîne vide dans le nom du fichier (par défaut:SaveFileDialog)
SaveFileDialog1.Title = "Enregistrer une liste" ' Spéficie le titre de la boîte de dialogue SaveFileDialog1
SaveFileDialog1.Filter = "Fichiers dat|*.dat" ' Applique un filtre sur les fichiers présent dans le dossier
reponse = SaveFileDialog1.ShowDialog() ' Affiche SaveFileDialog1
If reponse = Windows.Forms.DialogResult.OK Then ' Test si l'utilisateur à cliqué sur Annuler
     Dim SW As New StreamWriter(SaveFileDialog1.FileName) ' Ouvre le fichier spécifié dans SaveFileDialog1
    
     For i = 0 To ListView1.Items.Count - 1 ' Boucle sur le nombre d'items dans la ListView
          For j = 0 ListView1.Columns.Count - 1 ' Boucle sur le nombre de colonnes dans la ListView
               Save_Listview = Save_Listview & ListView1.Items(i).SubItems(j).Text & "|"
               ' Sauvegarde d'un item dans la ListView
          Next j
          SW.WriteLine(Save_Listview) ' Ecrit dans le fichier le contenu de la variable Save_Listview
          Save_Listview = ""  ' Remplacement du contenu de Save_Listview par une chaîne vide
     Next i
     SW.Close()  ' Fermeture du fichier
End If
, ----

(Coloration syntaxique automatique par Kenji)

Pour charger ce qui a été enregistré :

Dim OpenFileDialog1 As OpenFileDialog
Dim reponse As DialogResult

OpenFileDialog1.InitialDirectory = My.Application.Info.DirectoryPath + "\"
' Définit le répertoire à afficher lors de l'affichage de OpenFileDialog1
OpenFileDialog1.FileName = ""   ' Effacement de la zone Nom du fichier (par défaut : il est écrit OpenFileDialog) 
OpenFileDialog1.Title = "Ouvrir une liste" ' Spécifie le nom de la boîte de dialogue OpenFileDialog1
OpenFileDialog1.Filter = "Fichiers dat|*.dat" ' Spécifie les fichiers qui seront autorisés à apparaître
reponse = OpenFileDialog1.ShowDialog()    ' Affiche OpenFileDialog
If reponse = Windows.Forms.DialogResult.OK Then   ' Détecte si l'utilisateur à cliqué sur Annuler 
     Dim str As New StreamReader(OpenFileDialog1.FileName) ' Ouverture du fichier spécifié par OpenFileDialog1
     str.ReadLine()
     Do Until str.Peek = -1 ' Permet la lecture du fichier jusqu'à la fin de celui-ci
          val = str.ReadLine.Split("|")   ' Permet de lire un champs délimité par | 
          lvItem = Browsers(TabControl1.SelectedIndex).Items.Add(val(0)) ' Ajout du premier SubItem d'un Item
          For i = 1 To val.Length - 1
               lvItem.SubItems.Add(val(i)) ' Ajout des autres SubItems du Item
          Next i
     Loop
     str.Close()     ' Fermeture du fichier
End If, ----
(Coloration syntaxique automatique par Kenji)
------------------------------------------------------------------------------------------------------
N'oublies pas d'accepter si ce message a réglé ton problème  
0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
28 mars 2007 à 21:06
Salut,

Il y a une petite erreur dans le code pour charger la listview, voici la correction :

Dim OpenFileDialog1 As OpenFileDialog
Dim reponse As DialogResult

OpenFileDialog1.InitialDirectory = My.Application.Info.DirectoryPath + "\"
' Définit le répertoire à afficher lors de l'affichage de OpenFileDialog1
OpenFileDialog1.FileName = ""   ' Effacement de la zone Nom du fichier (par défaut : il est écrit OpenFileDialog) 
OpenFileDialog1.Title = "Ouvrir une liste" ' Spécifie le nom de la boîte de dialogue OpenFileDialog1
OpenFileDialog1.Filter = "Fichiers dat|*.dat" ' Spécifie les fichiers qui seront autorisés à apparaître
reponse = OpenFileDialog1.ShowDialog()    ' Affiche OpenFileDialog
If reponse = Windows.Forms.DialogResult.OK Then   ' Détecte si l'utilisateur à cliqué sur Annuler 
     Dim str As New StreamReader(OpenFileDialog1.FileName) ' Ouverture du fichier spécifié par OpenFileDialog1
     str.ReadLine()
     Do Until str.Peek = -1 ' Permet la lecture du fichier jusqu'à la fin de celui-ci
          val = str.ReadLine.Split("|")   ' Permet de lire un champs délimité par | 
          lvItem = ListView1.Items.Add(val(0)) ' Ajout du premier SubItem d'un Item
          For i = 1 To val.Length - 1
               lvItem.SubItems.Add(val(i)) ' Ajout des autres SubItems du Item
          Next i
     Loop
     str.Close()     ' Fermeture du fichier
End If, ----
(Coloration syntaxique automatique par Kenji)

L'erreur venait que je gérais un TabControl avec des ListView ancrés dans chaque TabPage et j'ai donc du créer une collection de ListView

@+
------------------------------------------------------------------------------------------------------
N'oublies pas d'accepter si ce message a réglé ton problème  
0
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
28 mars 2007 à 21:30
Ouinnnnnnnnn, ton code est bon, mais comme depuis le début, toujour le même bug!!! Je vous redécris l'erreur:à la ligne "Save_Listview Save_Listview & ListView1.Items(i).SubItems(j).Text & "|"", il me dit le message suivant: InvelidArgument la valeur 1 n'est pas valide pour 'index'

Voila

ebaudoux@club.fr

0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
28 mars 2007 à 22:14
Salut,

Est ce que dans ta listview tu as des lignes où les colonnes sont vides ?
0
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
28 mars 2007 à 22:20
oui, pourquoi?

ebaudoux@club.fr

0
cs_veler Messages postés 723 Date d'inscription dimanche 26 novembre 2006 Statut Membre Dernière intervention 23 janvier 2013 2
28 mars 2007 à 22:27
Parfait, sa fonctionne à présent. Euh, j'imagine que si la colonne est vide, lorsque je vais sauvegarder le listview, mettre un espace en guise de texte peut éviter les bugs? Sinon, s'il y a un autre moyen...

ebaudoux@club.fr

0
cs_fauve Messages postés 661 Date d'inscription vendredi 2 décembre 2005 Statut Membre Dernière intervention 23 mars 2011 8
28 mars 2007 à 22:37
oui, j'ai trouvé un autre moyen, plus besoin d'ajouter un espace dans les colonnes vides mon code le prends en charge. En effet, j'ai rajouté la fonction Try ... Catch (elle permet de traiter une erreur qui pourrait se produire lors de l'execution du programme).

Ici, quand mon code accédé à une colonne vide il te rends comme exception : ArgumentOutOfRangeException

J'ai attrapé cette erreur avec le Catch et au lieu de tenter de sauvegarder le contenu de la colonne je rajoute directement un espace dans Save_Listview

Entre Try et Catch, on met le code qu'on veut surveiller
Catch permet de traiter une erreur si elle se produit(ici ArgumentOutOfRangeException) et permet de traiter nous même cette erreur

Voici le code :

Dim SaveFileDialog1 As New SaveFileDialog
Dim reponse As DialogResult
Dim Save_Listview As String = ""

SaveFileDialog1.InitialDirectory = My.Application.Info.DirectoryPath + "\" ' Définit le répertoire de démarrage
SaveFileDialog1.FileName = ""   ' Permet de mettre une chaîne vide dans le nom du fichier (par défaut:SaveFileDialog)
SaveFileDialog1.Title = "Enregistrer une liste" ' Spéficie le titre de la boîte de dialogue SaveFileDialog1
SaveFileDialog1.Filter = "Fichiers dat|*.dat" ' Applique un filtre sur les fichiers présent dans le dossier
reponse = SaveFileDialog1.ShowDialog() ' Affiche SaveFileDialog1
If reponse = Windows.Forms.DialogResult.OK Then ' Test si l'utilisateur à cliqué sur Annuler
     Dim SW As New IO.StreamWriter(SaveFileDialog1.FileName) ' Ouvre le fichier spécifié dans SaveFileDialog1

     For i = 0 To ListView1.Items.Count - 1 ' Boucle sur le nombre d'items dans la ListView
          For j = 0 To ListView1.Columns.Count - 1 ' Boucle sur le nombre de colonnes dans la ListView
               Try
                    Save_Listview = Save_Listview & ListView1.Items(i).SubItems(j).Text & "|"
                    ' Sauvegarde d'un item dans la ListView
               Catch ex As ArgumentOutOfRangeException
                    Save_Listview = Save_Listview & " |"
               End Try
           Next j
                SW.WriteLine(Save_Listview) ' Ecrit dans le fichier le contenu de la variable Save_Listview
                Save_Listview = ""  ' Remplacement du contenu de Save_Listview par une chaîne vide
     Next i
     SW.Close()  ' Fermeture du fichier
End If, ----

(Coloration syntaxique automatique par Kenji)
0
troxsa Messages postés 553 Date d'inscription jeudi 28 novembre 2002 Statut Membre Dernière intervention 2 octobre 2016 1
29 mars 2007 à 00:32
Bonjour

Il suffit de faire
ListView1.Items.Count - 1 dans ta bouble !

http://www.troxsa.info/
Le site qui ne parle qu'un seul langage, visual basic 2005
0
Rejoignez-nous