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 :

remplissage listbox ordre specifique


Sujet :

VB.NET

  1. #1
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2011
    Messages : 115
    Points : 73
    Points
    73
    Par défaut remplissage listbox ordre specifique
    Bonjour a tous,
    je cherche a remplir ma listbox dans un certain ordre, sachant qu'elle liste des fichiers d'un repertoire :

    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
     
     Public Sub listefichierstexte(ByVal Rep As String)
            Try
                Dim Liste As String() = Directory.GetFileSystemEntries(Rep)
                Dim Entree As String
                For Each Entree In Liste
                    Dim TmpName As String = Microsoft.VisualBasic.Mid(Entree, Len(Rep) + 1)
                    TmpName = Replace(TmpName, "'\'", "")
     
                    If File.Exists(Entree) Then
                        ListBox1.Items.Add(TmpName)
                    Else
                        listefichierstexte(Entree)
                    End If
                Next (Entree)
            Catch Ex As System.UnauthorizedAccessException
                Exit Sub
            Catch e As Exception
                MsgBox("Erreur : " & e.Message)
            End Try
        End Sub
    par exemple au lieu d'avoir :
    dodo.18.05.2012.txt
    dodo.20.04.2012.txt
    dodo.05.08.2012.txt
    dodo.31.12.2011.txt

    avoir
    dodo.31.12.2011.txt
    dodo.20.04.2012.txt
    dodo.18.05.2012.txt
    dodo.05.08.2012.txt

    par ordre de création plus ou moins (le fichier porte le nom de la date ou il a été crée)
    Merci d'avance

  2. #2
    Membre éprouvé
    Avatar de dkmix
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    619
    Détails du profil
    Informations personnelles :
    Localisation : Jamaïque

    Informations forums :
    Inscription : Septembre 2007
    Messages : 619
    Points : 924
    Points
    924
    Par défaut
    Bonjour,

    Si les fichier peuvent prendre le format yyyymmjj, vous pouvez les ajouters à une liste et les trier avec sort().
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Dim files As List(Of String) = Directory.GetFileSystemEntries(Rep).ToList()
    files.Sort()
    Si le format des fichiers n'est pas modifiable, il faut une fonction qui compare les noms de fichiers.
    Lien msdn List.Sort

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonsoir,
    les classes d'information DirectoryInfo et FileInfo, me semblent mieux convenir.
    On ira chercher les informations par le biais d'une Structure contenant les propriétés du fichier qui nous intéressent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        Structure fileOk
            Public Name As String
            Public CreationDate As Date
            Public ChangeDate As Date
        End Structure
    La récupération se fait dans un Dictionary (ToDictionary()) auquel on attribue comme clé, la propriété servant au tri (OrderBy()) :
    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
        Sub ToDictionaryfileOk(ByVal Rep As DirectoryInfo)
     
            ' Créer une liste des valeurs des propriétés voulues de chaque fichiers.
            Dim filesOk As New List(Of fileOk)
            For Each fi As FileInfo In Rep.GetFiles()
                filesOk.Add(New fileOk With {.Name = fi.Name, .CreationDate = fi.CreationTime, .ChangeDate = fi.LastWriteTime})
            Next
     
            ' Créer un Dictionary (tri croissant) de ces valeurs avec date de création en clé.
            'N.B. "OrderByDescending" pour un tri décroissant. 
            Dim dict As New Dictionary(Of Date, fileOk)
            dict = filesOk.OrderBy(Function(kvp) kvp.CreationDate).ToDictionary(Function(kvp) kvp.CreationDate)
     
            ' Afficher les résultats.
            For Each kvp As KeyValuePair(Of Date, fileOk) In dict
                ListBox1.Items.Add(kvp.Value.Name)
            Next
     
        End Sub
    Enfin dans la procédure appelante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            '"chemRep" étant le chemin du répertoire voulu.
            Dim diSource As DirectoryInfo = New DirectoryInfo(chemRep)
            ToDictionaryfileOk(diSource)

  4. #4
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2011
    Messages : 115
    Points : 73
    Points
    73
    Par défaut
    merci pour votre aide, je devrai pouvoir me débrouiller avec ça

  5. #5
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2011
    Messages : 115
    Points : 73
    Points
    73
    Par défaut
    apparemment le "orderby" me pose problème car je suis sous en framework 2.0 (et contraint d'y rester).

  6. #6
    Membre actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Points : 205
    Points
    205
    Par défaut
    Bonjour

    Vous pouvez toujours utiliser un algorithme de tri, par exemple un tri dichotomique, puisque la classe DateTime possède une relation d'ordre.

    En espérant vous aider.

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonjour
    à tester sous FW2 :
    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
        Sub ToDictionaryDateCreate(ByVal Rep As DirectoryInfo)
     
            Dim dict As New Dictionary(Of Date, String)
            For Each fi As FileInfo In Rep.GetFiles()
                dict.Add(fi.CreationTime, fi.Name)
            Next
            ' Get list of keys.
            Dim keys As List(Of Date) = dict.Keys.ToList
            ' Sort the keys.
            keys.Sort()
     
            For Each kvp In keys
                ListBox1.Items.Add(dict.Item(kvp))
            Next
     
        End Sub

  8. #8
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2011
    Messages : 115
    Points : 73
    Points
    73
    Par défaut
    merci pour votre aide !
    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
     
     Sub ToDictionaryDateCreate(ByVal Rep As DirectoryInfo)
     
            Dim dict As New Dictionary(Of Date, String)
            For Each fi As FileInfo In Rep.GetFiles()
                dict.Add(fi.CreationTime, fi.Name)
            Next
            ' Get list of keys.
            Dim keys As List(Of Date) = dict.Keys.ToList
            ' Sort the keys.
            keys.Sort()
     
            For Each kvp In keys
                ListBox1.Items.Add(dict.Item(kvp))
            Next
     
        End Sub
    j'obtiens une erreur sur la ligne Dim keys As List(Of Date) = dict.Keys.ToList
    "'TolList' n'est pas un membre de 'System.Collections.Generic.Dictionary(Of Date, String).KeyCollection'."

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Re,
    à voir si ça passe :
    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
        Sub ToDictionaryDateCreate(ByVal Rep As DirectoryInfo)
     
            Dim dict As New Dictionary(Of Date, String)
            Dim keys As New List(Of Date)
     
            For Each fi As FileInfo In Rep.GetFiles()
                dict.Add(fi.CreationTime, fi.Name)
                keys.Add(fi.CreationTime)
            Next
     
            ' Sort the keys.
            keys.Sort()
     
            For Each kvp In keys
                ListBox1.Items.Add(dict.Item(kvp))
            Next
     
        End Sub

  10. #10
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2011
    Messages : 115
    Points : 73
    Points
    73
    Par défaut
    merci ! mais apparemment ça ne passe pas non plus, ça me dit que keys n'est pas une méthode

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 665
    Points : 1 161
    Points
    1 161
    Par défaut
    Bonjour,
    Je te propose une autre approche avec SortedList.
    Les éléments de SortedList sont triés par les clés :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        Sub SortedListFileOk(ByVal Rep As DirectoryInfo)
     
            Dim sortList As New SortedList(Of Date, String)
     
            For Each fi As FileInfo In Rep.GetFiles()
                sortList.Add(fi.CreationTime, fi.Name)
            Next
     
            For Each kvp As KeyValuePair(Of Date, String) In sortList
                ListBox1.Items.Add(kvp.Value)
            Next kvp
     
        End Sub

  12. #12
    Membre actif
    Homme Profil pro
    Retraité intello
    Inscrit en
    Juillet 2012
    Messages
    186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Retraité intello

    Informations forums :
    Inscription : Juillet 2012
    Messages : 186
    Points : 205
    Points
    205
    Par défaut
    Bonjour.

    Je vous propose le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
        Private Sub bTst_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles bTst.Click
            Essayer("dodo.01.01.2012.txt")
            Essayer("dada.03.05.2010.txt")
            Essayer("dudu.05.07.1915.txt")
            Essayer("fifi.01.01.2020.txt")
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        Public Sub Essayer(ByVal NomFichier As String)
            Dim Dte As Date, Ok As Boolean
            Dte = Date_(NomFichier, Ok)
            If Ok Then
                Placer(NomFichier)
            Else
                MsgBox("Le nom du fichier n'est pas conforme.")
            End If
        End Sub
    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
        Private Sub Placer(ByVal NomFichier As String)
            Dim n As Integer, a As Integer, b As Integer, c As Integer
            With lBox
                If .Items.Count = 0 Then
                    .Items.Add(NomFichier)
                Else
                    n = .Items.Count - 1
                    If n = 0 Then
                        If Date_(NomFichier) < Date_(.Items(0)) Then
                            .Items.Insert(0, NomFichier)
                        Else
                            .Items.Add(NomFichier)
                        End If
                    Else
                        If Date_(NomFichier) < Date_(.Items(0)) Then
                            .Items.Insert(0, NomFichier)
                        ElseIf Date_(NomFichier) >= Date_(.Items(n)) Then
                            .Items.Add(NomFichier)
                        Else
                            a = 0 : b = n : c = Int((a + b) / 2)
                            Do
                                If b - a = 1 Then Exit Do
                                If Date_(NomFichier) < .Items(c) Then b = c Else a = c
                                c = Int((a + b) / 2)
                            Loop
                            .Items.Insert(b, NomFichier)
                        End If
                    End If
                End If
            End With
        End Sub
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        Private Function Date_(ByVal NomFichier As String, Optional ByRef Ok As Boolean = False) As Date
            Dim Dte As Date, Txt As String
            Txt = ""
            Ok = (Strings.Right(NomFichier, 3) = "txt")
            If Ok Then Ok = (Len(NomFichier) >= 14)
            If Ok Then
                Txt = Strings.Right(NomFichier, 14)
                Txt = Strings.Left(Txt, 10)
                Txt = Strings.Replace(Txt, ".", "/")
                Ok = IsDate(Txt)
            End If
            If Ok Then Dte = CDate(Txt) Else Dte = Now
            Return Dte
        End Function
    qui tient dans un formulaire sur lequel sont déposés un bouton de commande nommé "bTst" et une ListBox nommée lBox.

    Cordialement.

  13. #13
    Membre régulier
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2011
    Messages : 115
    Points : 73
    Points
    73
    Par défaut
    merci pour l'aide ! Je pense que ça devrait faire l'affaire.

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

Discussions similaires

  1. [VB6] Remplissage ListBox à partir d'une liste
    Par speedster dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 06/06/2006, 13h35
  2. [VBA-E] eviter blanc remplissage listbox avec tableau
    Par chmod777 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 14/04/2006, 12h16
  3. Remplissage ListBox
    Par beb30 dans le forum MFC
    Réponses: 4
    Dernier message: 29/03/2006, 10h11
  4. [VBA-A]Remplissage ListBox
    Par cuicui08 dans le forum VBA Access
    Réponses: 18
    Dernier message: 27/02/2006, 11h05
  5. [C#] remplissage listBox avec un dataSet
    Par aymron dans le forum ASP.NET
    Réponses: 5
    Dernier message: 18/10/2005, 10h44

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