IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VB.NET Discussion :

Ajouter subitems dans listview (boucle)


Sujet :

VB.NET

  1. #1
    Membre du Club Avatar de aus3004
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 47
    Points
    47
    Par défaut Ajouter subitems dans listview (boucle)
    Bonjour,

    J'ai une listview qui se génère comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ListView1.Columns.Add("Site de connexion", 107, HorizontalAlignment.Left)
            ListView1.Columns.Add("Login/identifiant", 177, HorizontalAlignment.Left)
            ListView1.Columns.Add("Mot de passe", 177, HorizontalAlignment.Left)
            ListView1.Columns.Add("Date d'ajout", 106, HorizontalAlignment.Left)
    J'ai mon code qui permet d'ouvrir un document texte et de sélectionner une ligne sur deux et d'afficher à partir du 16ème caractère le texte dans la colonne "Login/identifiant".
    Comme il y a plusieurs lignes dans mon document texte, la ligne qui suit est copiée dans la colonne d'à côté. Ce que je voudrais c'est passer à la ligne en dessous lorsque la première case de "Login/identifiant" est remplie. J'ai essayé divers trucs mais ca ne donne rien, j'arrive pas à informer dans la boucle que quand une case est remplie, on passe à celle d'en dessous comme une listbox.

    Voila mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    Private Sub ChargerMAJToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ChargerMAJToolStripMenuItem.Click
            OpenFileDialog1.AddExtension = True ' Ouvre les documents txt
            OpenFileDialog1.Filter = "(*.txt)|*.txt|Tous les fichiers (*.*)|*.*"
            'If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            Dim monStreamReader As New StreamReader("D:\mdp.txt") 'Stream pour la lecture
            Dim ligne As String ' Variable contenant le texte de la ligne
            Dim listing As New ListViewItem
            Dim i As Integer = 0
            ligne = monStreamReader.ReadLine()
            While Not ligne Is Nothing
                If i Mod 2 = 0 Then
                    Dim login As String = ligne
                    login = login.Substring(16)
                    listing.SubItems.Add(login)
                End If
                ligne = monStreamReader.ReadLine()
                i = i + 1
            End While
            ListView1.Items.Add(listing)
            monStreamReader.Close()
        End Sub
    Merci à vous, si vous pouvez me dépanner

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 673
    Points : 1 175
    Points
    1 175
    Par défaut
    Bonjour,
    en principe, il faut enregistrer l'item dès qu'un login est trouvé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
            Dim monStreamReader As New StreamReader(fichierALire) 'Stream pour la lecture
            Dim ligne As String ' Variable contenant le texte de la ligne
            'Dim listing As New ListViewItem
            Dim i As Integer = 0
            ligne = monStreamReader.ReadLine()
            While Not ligne Is Nothing
                If i Mod 2 = 0 Then
                    Dim login As String = ligne
                    login = login.Substring(16)
                    Dim listing As New ListViewItem()
                    ''*** Ligne suivante à ajouter pour sauter une colonne.
                    'listing.SubItems.Add("")
                    listing.SubItems.Add(login)
                    ListView1.Items.Add(listing)
                End If
                ligne = monStreamReader.ReadLine()
                i = i + 1
            End While
            'ListView1.Items.Add(listing)
            monStreamReader.Close()

  3. #3
    Membre du Club Avatar de aus3004
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 47
    Points
    47
    Par défaut
    Merci beaucoup chrismonoye, le code est fonctionnel !!!!!

    Mais j'ai encore deux problèmes :

    1. si je met
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    listing.Items.Add(site)
    dans la colonne 1, j'ai l'erreur
    Erreur 4 'Items' n'est pas un membre de 'System.Windows.Forms.ListViewItem'.
    2. pour les autres colonnes cela fonctionne bien mais quand la colonne 2 est remplie et que cela passe à la 3 les items sont ajouté au niveau du dernier item de la colonne 2, pareil pour la colonne 4 avec le dernier item de la colonne 3.
    Ex : c1 c2 c3 c4
    -------m1
    -------m2
    -------m3
    -----------m1
    -----------m2
    --------------m1
    --------------m2

    Merci encore
    Images attachées Images attachées  

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 673
    Points : 1 175
    Points
    1 175
    Par défaut
    Après avoir valorisé tes variables "site", "login", "motPasse" et "dateajout",
    je pense qu'il faudrait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                    Dim listing As New ListViewItem(site)
                    listing.SubItems.Add(login)
                    listing.SubItems.Add(motPasse)
                    listing.SubItems.Add(dateajout)
                    ListView1.Items.Add(listing)
    Je ne sais pas si cela t'est possible, le but étant de remplir la ligne entièrement avant de passer à la suivante.

  5. #5
    Membre du Club Avatar de aus3004
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 47
    Points
    47
    Par défaut
    Merci la colonne "site" est bien formée

    Il reste plus que le problème du :
    Ex : c1 c2 c3 c4
    ----m1
    ----m2
    -------m1
    -------m2
    -------m3
    -----------m1
    -----------m2
    --------------m1
    --------------m2

    Tu pense pas que c'est impossible !!?
    Il faudrait dire que si il y a des cases vides au dessus alors on décale.
    Mais les subsitems ne concernent que de droite à gauche. Il y aurait-il pas une fonction pour de haut en bas ?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 673
    Points : 1 175
    Points
    1 175
    Par défaut
    Bonsoir,
    selon ce que je connais,
    New ListViewItem("toto") créé un nouvel élément dans Listview, et on peut lui adjoindre des objets ListViewItem.
    Ce ListViewItem forme une ligne si on peut dire et chaque New ListViewItem en créé une nouvelle.
    D'où le résultat que tu décris.
    C'est pour cela qu'il est plus simple de renseigner l'élément et tous ces objets et d'ajouter le tout au ListView.
    Remplir colonne par colonne nécessiterait de rappeler la ligne pour la modifier.
    C'est sûrement possible, mais coder ça ...
    Maintenant, reste à savoir à quoi ressemble le fichier txt.
    Est il possible d'y extraire au préalable "site", et ses objets "login" etc ...
    Pourquoi traiter une ligne sur deux?
    Est il imposé ou le créés tu toi même?
    Un extrait significatif de celui ci, permettrait aux lecteurs de cette discussion de t'apporter plus d'éléments de solution.

  7. #7
    Membre du Club Avatar de aus3004
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 47
    Points
    47
    Par défaut
    C'est vraiment sympat de t'intéresser de près à mon problème
    Voila plus de détail.

    J'ai 4 fonctions :
    functiondateajoutfichier()
    functionlogin()
    functionmdp()
    functionsiteconnect()

    Les fonctions sont construites sous cette forme (exemple de functionlogin) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    Private Function functionlogin()
            Try
                Dim monStreamReader As New StreamReader("D:\mdp.txt") 'Stream pour la lecture
                Dim ligne As String ' Variable contenant le texte de la ligne
                Dim i As Integer = 0
                ligne = monStreamReader.ReadLine()
                While Not ligne Is Nothing
                    If i Mod 2 = 0 Then
                        Dim login As String = ligne
                        login = login.Substring(17)
                        Dim listing As New ListViewItem(login)
                        ListView1.Items.Add(listing)
                    End If
                    ligne = monStreamReader.ReadLine()
                    i = i + 1
                End While
                monStreamReader.Close()
            Catch
            End Try
        End Function
    Le fichier texte est construit sous cette forme :
    Adresse e-mail : xxxxxx@xxxxx.xx
    Mot de passe : xxxxxxxxxx
    Adresse e-mail : xxxxxxxx@xxxx.xxx
    Mot de passe : xxxxx
    Adresse e-mail : xxxxxxx@xxxx.xx
    Mot de passe : xxxxxxx
    Adresse e-mail : xxxxxxx@xxxxxx.xx

    - pour le login j'utilise une ligne sur deux, celle qui correspond à l'email
    - je peux pas changer la structure du texte, elle m'est imposer par les opérations qui ont construises ce document texte.

    Je pense qu'en intervenant directement dans les fonctions on pourrait y arriver, non ?

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    673
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 673
    Points : 1 175
    Points
    1 175
    Par défaut
    Bonsoir,
    dans le principe et dans l'idée de traiter "ligne par ligne", je fonctionnerais avec une ArrayList qui collecterait les éléments de chaque "ligne" du ListView :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
        Dim i As Integer = 0
     
        Private Function login_mdp(ByVal fichierALire As String) As ArrayList
            '*** Création une ArrayList, qui à chaque ligne, enregistrera :
            '    site (retourné par la fonction "siteconnect".
            '    login et mdp, traités depuis le fichier txt.
            '    Et dateAjout (retourné par le fonction "dateajoutfichier").
            '    chacun séparé par un Tab pour les retrouver ultérieurement.
            Dim temp As New ArrayList()
            Dim tempLigne As String = ""
            Dim monStreamReader As New StreamReader(fichierALire) 'Stream pour la lecture
            Dim ligne As String ' Variable contenant le texte de la ligne
            Dim i As Integer = 0
            ligne = monStreamReader.ReadLine()
            Dim login As String = ""
            Dim mdp As String = ""
            Dim site As String = siteconnect()
            Dim dateAjout As DateTime = dateajoutfichier()
     
            While Not ligne Is Nothing
                If i Mod 2 = 0 Then
                    login = ligne.Substring(17)
                Else
                    mdp = ligne.Substring(15)
                    tempLigne = login & vbTab & mdp
                    temp.Add(site & vbTab & tempLigne & vbTab & dateAjout)
     
                End If
                ligne = monStreamReader.ReadLine()
                i = i + 1
            End While
     
            Return temp
     
        End Function
    J'ai ajouté pour nourrir les 2 fonctions siteconnect() et dateajoutfichier(), pour tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        Private Function siteconnect() As String
            '*** Pour tester
            siteconnect = "toto"
        End Function
     
        Private Function dateajoutfichier() As DateTime
            '*** Pour tester
            Dim startTime As DateTime = DateTime.Now
            Return startTime
        End Function
    Et enfin pour remplir le listView, dans la procédure appelante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
            Dim temp As New ArrayList()
            temp = (login_mdp(Application.StartupPath & "\mdp.txt"))
     
            ListView1.BeginUpdate()
            For i As Integer = 0 To temp.Count - 1
                Dim ligne As String = CStr(temp.Item(i))
                Dim champs() As String
                '*** Tab scinde la ligne pour renseigner ListViewItem et ses SubItems.
                champs = ligne.Split(CChar(vbTab))
     
                Dim item1 = New ListViewItem(champs(0), 0)
                item1.SubItems.Add(champs(1))
                item1.SubItems.Add(champs(2))
                item1.SubItems.Add(champs(3))
                ListView1.Items.Add(item1)
            Next
            ListView1.EndUpdate()
    c'est une base de réflexion parmi d'autres.

  9. #9
    Membre du Club Avatar de aus3004
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 74
    Points : 47
    Points
    47
    Par défaut
    @chrismonoye, c'est impécable !!
    Je sais pas comment te remercier.

    Merci beaucoup et (très) bon développement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajouter dans listView
    Par abbd dans le forum Visual C++
    Réponses: 1
    Dernier message: 07/03/2007, 19h00
  2. Ajouter image dans une ListView
    Par Dimitri_87 dans le forum Windows Forms
    Réponses: 1
    Dernier message: 20/02/2007, 00h50
  3. ajout dynamique dans une listview
    Par k_boy dans le forum VC++ .NET
    Réponses: 3
    Dernier message: 21/09/2006, 11h23
  4. [c# VS2005] Sélection d'un subitem dans un ListView
    Par FredericB dans le forum Windows Forms
    Réponses: 1
    Dernier message: 29/06/2006, 16h13
  5. Ajouter une colonne (par du code) dans Listview
    Par __fabrice dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 23/11/2005, 17h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo