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 :

Trier une listview par dates


Sujet :

VB.NET

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 428
    Points : 86
    Points
    86
    Par défaut Trier une listview par dates
    Bonjour,
    je remplis une listview avec le code ci-dessous, il y a une seule colonne composée de plusieurs items
    exemple de 1 item: atelier n°1; machine n°1; réparation n°1; 12.11.2018
    et j'aimerai trier sur les dates
    existe-il une instruction pour trier seulement sur les dates d'un item?

    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
    Dim filename As String
            filename = ".\entretien.ini"
            Dim ligne2 As String
            Dim sr3 As StreamReader = New StreamReader(filename, System.Text.Encoding.UTF7)
            While sr3.EndOfStream = False
                ligne2 = sr3.ReadLine()
                If ligne2 = "[Prochain entretien]" Then
                    While sr3.EndOfStream = False 'si c'est le dernier bloc et la fin du fichier
                        Dim MyLine As ListViewItem = New ListViewItem(New String() {sr3.ReadLine})
                        prochain_entretien.ListView1.Items.Add(MyLine)
                    End While
                    Exit While
                End If
            End While
            sr3.Close()

  2. #2
    Membre averti Avatar de Delaney
    Homme Profil pro
    Developpeur VB amateur
    Inscrit en
    Mars 2014
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Developpeur VB amateur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2014
    Messages : 148
    Points : 372
    Points
    372
    Par défaut
    Pas directement et pas simplement car ce que tu rentres comme info dans ta listview n'est pas une date, un n° de machine ou d'atelier mais un ensemble de caractère : une string.
    dans ton exemple, ce que tu rentres n'est donc pas le 12 novembre 2018 mais juste la string "12.11.2018"

    Il faudrait donc récupérer l'ensemble des string dans un tableau, les analyser au niveau de la partie "date" pour les ordonner numériquement.

    Le plus simple serait de stocker tes informations dans un tableau à 3 dimensions ou une liste et de travailler sur la dimension qui contient la date et de récupérer la ligne qui contient la date sélectionnée.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 428
    Points : 86
    Points
    86
    Par défaut
    d'accord, je vais regarder dans ce sens, merci

  4. #4
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonjour,

    Dès lors qu'il n'y a qu'une seule colonne dans la ListView, pourquoi ne pas utiliser plutôt une ListBox qui est d'un usage beaucoup plus simple .
    Dès lors (encore) qu'il n'y a qu'une chaine d'informations pas ligne, et que la date constitue les 10 derniers caractères de cette chaine, il n'est pas trop difficile de programmer un Tri (un tri à bulles, par exemple).
    Simplement, la comparaison entre 2 lignes successives ne doit pas être faite sur tous les caractères, mais seulement sur les 10 derniers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    If MaLigne(i).Substring(MaLigne(i).Count -10) >  MaLigne(i+1).Substring(MaLigne(i+1).Count -10) Then ' .... il faut permuter les 2 lignes
    Si vous avez d'un besoin d'un tri quasi sur mesure, je vous le ferai avec plaisir ...

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 428
    Points : 86
    Points
    86
    Par défaut
    merci pour la réponse, mais que faut il mettre après le then?
    mais la comparaison est sur des strings et pas des dates?

    voici le nouveau 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
    22
    23
    24
    25
    26
    27
    Dim filename As String
            filename = ".\entretien.ini"
            Dim ligne2 As String
            Dim sr3 As StreamReader = New StreamReader(filename, System.Text.Encoding.UTF7)
            While sr3.EndOfStream = False
                ligne2 = sr3.ReadLine()
                If ligne2 = "[Prochain entretien]" Then
                    'For i = 1 To 1000
                    ' While ligne2 <> "" 'si la ligne suivant ton bloc à récupérer est vide
                    'While ligne2 <> "[Bloc suivant]" 's'il y a un autre bloc juste après
                    While sr3.EndOfStream = False 'si c'est le dernier bloc et la fin du fichier
                                Dim MyLine As ListViewItem = New ListViewItem(New String() {sr3.ReadLine})
                        prochain_entretien.ListView1.Items.Add(MyLine)
                        For i = 1 To prochain_entretien.ListView1.Items.Count
                            If MyLine(i).Substring(MyLine(i).Count - 10) > MyLine(i + 1).Substring(MyLine(i + 1).Count - 10) Then
     
                            End If
                        Next
                        'Next
                    End While
                    '    End While
                    'End While
     
                    Exit While
                End If
            End While
            sr3.Close()
    pour la ligne If MyLine(i).Substring(MyLine(i).Count - 10) > MyLine(i + 1).Substring(MyLine(i + 1).Count - 10) Then il me dit que myline ne peut pas etre indexé car il n'a pas de propriété par défault?

  6. #6
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Je suppose que
    pour la ligne If MyLine(i).Substring(MyLine(i).Count - 10) > MyLine(i + 1).Substring(MyLine(i + 1).Count - 10) Then il me dit que myline ne peut pas etre indexé car il n'a pas de propriété par défault?
    est du au fait qu'il ne s'agit pas d'une ListBox (mais d'un ListView).
    Les lignes d'une ListBox sont accessibles par leurs indices. Dans le cas du ListView, chaque ligne est constituée d'un ListViewItem, lequel contient la(les) colonne(s).
    Il te faut donc balayer le ListView et récupérer chaque ListViewItem pour obtenir une ligne à chaque fois mais franchement, s'il n'y a qu'une seule colonne, le ListBox est plus simple ! Mais tu as sans doute d'autres moyens car finalement, tes infos viennent de fichiers et y retournent, je pense ... tu sais donc accéder à chaque ligne, non ?

    Pour ce qui est du tri, tu veux le faire sur des dates qui ne sont en réalité (dans ton cas) que des morceaux de chaines de caractères, donc des chaines de caractères elles-mêmes. L'extraction que je fais avec .Substring(MyLine(i ...).Count - 10) prends bien les 10 caractères représentant une date ou bout de la ligne.
    Cette opération est faite pour la ligne en cours désignée par l'indice i et pour la ligne suivante désignée par l'indice i+1. J'obtiens ainsi 2 chaines que je compare. Pour un ordre croissant, si une chaine est plus grande que la suivante, il faut permuter les deux chaines. A noter au passage que la boucle doit s'arrêter à LaListe.NombreDeLignes - 2.
    Je peux encore donner la méthode de permutation dans son principe :
    • UneChaineTemporaire = MyLine(i)
    • MyLine(i) = MyLine(i+1)
    • MyLine(i+1) = UneChaineTemporaire
    Mais il s'agit là du principe de la permutation et son application réelle dépend de l'objet qui contient les chaines (un tableau, une ListBox, une ListView, ...) car les opérations de lecture et d'écriture des chaines diffèrent, par ex. MyLine.ReplaceAt(i+1, UneChaineTemporaire).

    Une autre difficulté que tu poses est celle de l'ordre des dates. En comparant uniquement les représentations des dates de tes lignes, le tri va "considérer" que 31/10/2018 est plus grand que 30/12/2018. Pour un tri strictement alphabétique, c'est correct mais pas pour un tri chronologique.
    Pour faire correctement un tri alphabétique qui respecte la chronologie des dates représentées, il faut d'abord "retourner" les dates et ensuite faire le tri alphabétique.
    31/10/2018 retourné ==> 2018/10/31
    30/12/2012 retourné ==> 2018/12/30
    En comparant ces chaines des dates "retournées", le tri alphabétique va "considérer" que 2018/10/31 est plus petit que 2018/12/30, ce qui correct, même du point de vue chronologique.

    Ton traitement est donc assez lourd :
    A l'intérieur d'une boucle qui balaye les lignes : For i = 0 à NombreDeLigne-2

    Extraire la date de la chaine de la ligne (i), soit SDateLigne1
    Extraire la date de la chaine de la ligne (i+1), soit SDateLigne2
    Retourner SDateLigne1 (écrire une fonction RetourneChaine(S as String As String)) , soit SRDate1
    Retourner SDateLigne2 , soit SRDate2

    Si SRDate1 > SRDate2 Alors il faut permuter

    Selon l'algorithme de tri choisi, la boucle For doit être relancée plusieurs fois.

    Je veux bien être plus précis dans l'écriture du tri, mais il me faut savoir comment tu comptes obtenir distinctement une ligne i et sa suivante de l'ensemble de tes lignes. Il te faut aussi connaître le nombre de lignes présentes dans l'objet.

    Pour ce soir, je ne disposerai sans doute plus d'assez de temps pour y travailler, mais demain dans l'après-midi ...

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 428
    Points : 86
    Points
    86
    Par défaut
    merci bien pour l'explication

  8. #8
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    J'ai trouvé un peu de temps.
    Ci-joint, le dossier complet d'un test que je viens de réaliser sur le ListView : PListView.zip
    Voici le 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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    Public Class FBase
     
        Private Sub FBase_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
            MaListView.Clear()
            MaListView.Columns.Add("Informations", MaListView.Width, System.Windows.Forms.HorizontalAlignment.Right)
            MaListView.HeaderStyle = ColumnHeaderStyle.Clickable   ' Type d’entête de colonne
            MaListView.View = View.Details                 ' Mode d’affichage
     
            For Jour As Integer = 12 To 1 Step -1
                MaListView.Items.Add("Info " & Jour & " Blabla, et la date : " & Jour.ToString("0#") & "/11/2018")   ' Création de la ligne avec la donnée de colonne 0
            Next
     
        End Sub
     
        Private Sub BTest_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTest.Click
            ' Trier par "Date" ..............
            Dim SLigne1 As String
            Dim SLigne2 As String
            Dim SDate1 As String
            Dim SDate2 As String
            Dim RetourneeDate1 As Long
            Dim RetourneeDate2 As Long
            Dim IndiceBoucle As Integer
            Dim TemoinPermutation As Boolean = True  ' Vaut False quand il n'y a plus de permutation
            Dim Temporaire As String
     
            While TemoinPermutation
                TemoinPermutation = False
                For IndiceBoucle = 0 To MaListView.Items.Count - 2
                    SLigne1 = MaListView.Items(IndiceBoucle).Text
                    SLigne2 = MaListView.Items(IndiceBoucle + 1).Text
                    SDate1 = SLigne1.Substring(SLigne1.Count - 10)
                    SDate2 = SLigne2.Substring(SLigne2.Count - 10)
                    RetourneeDate1 = ValeurDateInverse(SDate1)
                    RetourneeDate2 = ValeurDateInverse(SDate2)
                    If RetourneeDate1 > RetourneeDate2 Then
                        TemoinPermutation = True
                        Temporaire = MaListView.Items(IndiceBoucle).Text
                        MaListView.Items(IndiceBoucle).Text = MaListView.Items(IndiceBoucle + 1).Text
                        MaListView.Items(IndiceBoucle + 1).Text = Temporaire
                    End If
                Next
            End While
        End Sub
     
        Private Function ValeurDateInverse(ByVal S As String) As Long
            Dim VDI As Long   ' ValeurDateInverse
            VDI = CType(S.Substring(0, 2), Long)
            VDI = VDI + CType(S.Substring(3, 2), Long) * 100
            VDI = VDI + CType(S.Substring(S.Length - 4), Long) * 10000
            Return VDI
        End Function
     
    End Class
    Au chargement du Form, je remplis la ListView avec des lignes terminées par une date, le tout en ordre décroissant. J'applique ensuite le tri que j'esquissais tout à l'heure.
    Seule différence par rapport à mes explications du message précédent, j'ai retourné les dates sous forme d'entiers longs (et non sous forme de chaine) car les zéros non significatifs me posaient quelques soucis).
    Pour le reste, l'algorithme de tri est programmé sous le BTest_Click de façon fort décomposée et fort lisible pour que tu puisses comparer avec mes explications de tout à l'heure.
    Ceci devrait te permettre d'avancer ...
    Nom : AvantTri.jpg
Affichages : 850
Taille : 32,9 KoNom : ApresTri.jpg
Affichages : 884
Taille : 31,7 Ko

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 428
    Points : 86
    Points
    86
    Par défaut
    Un grand merci, je vais adapter ce code à mon exercice, encore merci

    C'est parfait, j'ai testé sur mon exemple avec 1 modif et ca marche extra, merci

    bonsoir Phil Rob, excusez moi je dois encore trier sur le meme principe une combobox avec les meme string et trier sur les dates.
    est il possible d'utiliser le meme code un peu modifié?

    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
    Dim SLigne1 As String
            Dim SLigne2 As String
            Dim SDate1 As String
            Dim SDate2 As String
            Dim RetourneeDate1 As Long
            Dim RetourneeDate2 As Long
            Dim IndiceBoucle As Integer
            Dim TemoinPermutation As Boolean = True  ' Vaut False quand il n'y a plus de permutation
            Dim Temporaire As String
     
            While TemoinPermutation
                TemoinPermutation = False
                For IndiceBoucle = 0 To ComboBox7.Items.Count - 2
                    SLigne1 = ComboBox7.Items(IndiceBoucle)
                    SLigne2 = ComboBox7.Items(IndiceBoucle + 1)
                    SDate1 = SLigne1.Substring(SLigne1.Count - 10)
                    SDate2 = SLigne2.Substring(SLigne2.Count - 10)
                    RetourneeDate1 = ValeurDateInverse(SDate1)
                    RetourneeDate2 = ValeurDateInverse(SDate2)
                    If RetourneeDate1 > RetourneeDate2 Then
                        TemoinPermutation = True
                        Temporaire = ComboBox7.Items(IndiceBoucle)
                        ComboBox7.Items(IndiceBoucle) = ComboBox7.Items(IndiceBoucle + 1)
                        ComboBox7.Items(IndiceBoucle + 1) = Temporaire
                    End If
                Next
            End While
    ce code fontionne très bien

    encore une dernière chose, quel évènement faut-il pour que quand on clic sur une string de la listview on déclenche un événement ou on puisse coder ?

  10. #10
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonsoir,

    Très bien que tu aies converti mon code de ListView vers ComboBox, bien que les accès soient un peu différents.
    Voici mon code pour d'éventuelles corrections :
    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
        Private Sub BTestCombo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTestCombo.Click
            ' Trier par "Date" ..............
            Dim SLigne1 As String
            Dim SLigne2 As String
            Dim SDate1 As String
            Dim SDate2 As String
            Dim RetourneeDate1 As Long
            Dim RetourneeDate2 As Long
            Dim IndiceBoucle As Integer
            Dim TemoinPermutation As Boolean = True  ' Vaut False quand il n'y a plus de permutation
            Dim Temporaire As String
     
            While TemoinPermutation
                TemoinPermutation = False
                For IndiceBoucle = 0 To MaComboBox.Items.Count - 2
                    SLigne1 = MaComboBox.Items(IndiceBoucle).ToString
                    SLigne2 = MaComboBox.Items(IndiceBoucle + 1).ToString
                    SDate1 = SLigne1.Substring(SLigne1.Count - 10)
                    SDate2 = SLigne2.Substring(SLigne2.Count - 10)
                    RetourneeDate1 = ValeurDateInverse(SDate1)
                    RetourneeDate2 = ValeurDateInverse(SDate2)
                    If RetourneeDate1 > RetourneeDate2 Then
                        TemoinPermutation = True
                        Temporaire = MaComboBox.Items(IndiceBoucle).ToString
                        MaComboBox.Items(IndiceBoucle) = MaComboBox.Items(IndiceBoucle + 1).ToString
                        MaComboBox.Items(IndiceBoucle + 1) = Temporaire
                    End If
                Next
            End While
        End Sub
    Pour ce qui est des événements de la ListView, il y en a beaucoup. Voici un test qui te permet de connaitre l'indice de la ligne cliquée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Private Sub MaListView_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles MaListView.Click
            MessageBox.Show(MaListView.SelectedIndices(0))  ' Donne l'indice de la ligne qu'on vient de cliquer.
        End Sub
    Bonne soirée,

  11. #11
    Expert confirmé
    Avatar de wallace1
    Homme Profil pro
    Administrateur systèmes
    Inscrit en
    Octobre 2008
    Messages
    1 966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 966
    Points : 4 005
    Points
    4 005
    Billets dans le blog
    7
    Par défaut
    Va falloir arrêter de faire du "spoon feeding" Phil !
    Ce qu on attends des membres d'une communauté :

    - ceux qui veulent aider : on oriente le demandeur en donnant des pistes de recherche et on évite de leur livrer du code prêt à l'emploi.

    - ceux qui demandent de l'aide : on potasse des cours de programmation, on appréhende la prise en main des outils de développement, l 'EDI notamment, on évite de demander des solutions sans même avoir cherché !

    Les événements du listview sont disponibles sur MSDN et dans ton EDI, il en existe pas 50 000 donc tu les parcours et tu lis leur description pour savoir a quoi ils correspondent c est aussi simple que cela !

    Itemselectionchanged est adapté à ce que tu veux faire, ça c est le genre de réponse qui te demandera un investissement personnel pour solutionner entièrement ton problème !!!

    Bonne lecture.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 428
    Points : 86
    Points
    86
    Par défaut
    merci phil de votre aide

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 428
    Points : 86
    Points
    86
    Par défaut
    j'aurai besoin sur le meme principe de trier un fichier texte mais il me dit que l'index est hors limite?
    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
    Dim SR4 As New StreamReader("mail.txt", System.Text.Encoding.UTF7)
            Dim SLigne1 As String
            Dim SLigne2 As String
            Dim SDate1 As String
            Dim SDate2 As String
            Dim RetourneeDate1 As Long
            Dim RetourneeDate2 As Long
            Dim IndiceBoucle As Integer
            Dim TemoinPermutation As Boolean = True  ' Vaut False quand il n'y a plus de permutation
            Dim Temporaire As String
     
            While TemoinPermutation
                TemoinPermutation = False
                Do Until SR4.Peek = -1
                    SLigne1 = SR4.ReadLine(IndiceBoucle).ToString
                    SLigne2 = SR4.ReadLine(IndiceBoucle + 1).ToString
                    SDate1 = SLigne1.Substring(SLigne1.Count - 10)
                    SDate2 = SLigne2.Substring(SLigne2.Count - 10)
                    RetourneeDate1 = ValeurDateInverse(SDate1)
                    RetourneeDate2 = ValeurDateInverse(SDate2)
                    If RetourneeDate1 > RetourneeDate2 Then
                        TemoinPermutation = True
                        Temporaire = SR4.ReadLine(IndiceBoucle).ToString
                        SLigne1 = SR4.ReadLine(IndiceBoucle + 1).ToString
                        SLigne2 = Temporaire
                    End If
                Loop
            End While
            SR4.Close()

  14. #14
    Modérateur
    Avatar de ProgElecT
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2004
    Messages
    6 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Décembre 2004
    Messages : 6 077
    Points : 17 172
    Points
    17 172
    Par défaut
    Salut

    Je pense qu'il te faut vérifier si ta variable SLigne2 n'est pas null ou vide avant que d'utiliser SDate2 = SLigne2.Substring(SLigne2.Count - 10) qui doit être la ligne ou se produit l'erreur.
    Soyez sympa, pensez -y
    Balises[CODE]...[/CODE]
    Balises[CODE=NomDuLangage]...[/CODE] quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Balises[C]...[/C] code intégré dans une phrase.
    Balises[C=NomDuLangage]...[/C] code intégré dans une phrase quand vous mettez du code d'un autre langage que celui du forum ou vous postez.
    Le bouton en fin de discussion, quand vous avez obtenu l'aide attendue.
    ......... et pourquoi pas, pour remercier, un pour celui/ceux qui vous ont dépannés.
    👉 → → Ma page perso sur DVP ← ← 👈

  15. #15
    Membre émérite Avatar de Phil Rob
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2013
    Messages
    1 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 613
    Points : 2 865
    Points
    2 865
    Par défaut
    Bonsoir,

    A propos des indices (ou index) en dehors des limites :
    Dans une collection, ou un tableau, ou un objet du type "liste", ..., les données sont accessibles notamment sur base d'un indice (ex. T(i), .Items(i), ...).
    Ces données sont indicées de 1 à NbreElements, ou de 0 à à NbreElements-1, ce dernier cas est bien le plus fréquent aujourd'hui.
    Dans l'algorithme de tri que je t'ai proposé, l'ensemble des données est balayé par une boucle dont l'indice varie du premier élément jusqu'à l'avant dernier, avant dernier parce qu'on compare le ième élément avec le suivant et donc, quand on regarde l'avant dernier, on le compare avec le suivant, c-à-d le dernier (qui n'est donc pas oublié ...)
    Ainsi donc, l'indice de la boucle doit varier de 1 à NbreElements-1 ou bien de 0 à NbreElements-2. Dans le cas d'une ListView, ou d'une ComboBox, le nombre d'éléments est donné par Count, le dernier élément étant à l'indice Count-1, et dans le tri, on va jusque Count-2.
    Tout ce blabla pour tu comprennes bien les limites de l'indice et te poser la question : qu'en est-il avec ton fichier ? 0 à N-2 ou 1 à N-1 ? Mais ne réfléchis pas trop à comment régler les indices dans le cas du fichier ...
    En effet, à propos du tri :
    Le tri que je t'ai proposé est un tri "Table", du genre tri par permutation directe : mon algorithme de tri est directement dérivé du célèbre tri à bulles.
    Sauf avec des fichiers en accès relatif (fichier à accès direct), il n'est pas possible d'utiliser un algorithme basé sur la permutation directe, pas de tri à bulles pour les fichiers (ce qui serait très peu rentable, de toute manière). Tu dois bien t'en rendre compte : avec la ComboBox, tu lis les éléments d'indices i et i+1, et tu récris les i en i+1 et les i+1 en i (en passant par la variable temporaire). Avec les fichiers, non seulement tu ne peux désigner l'enregistrement que tu veux lire, mais encore moins celui que tu veux écrire (puisque tu ne peux écrire à un endroit précis du fichier).
    Alors comment trier un fichier ?
    Le tri de base est le tri par division-fusion, dit aussi tri 3 bandes (parce qu'à l'époque où un fichier était stocké sur une bande magnétique, son tri nécessitait la mise en place de 2 bandes supplémentaires).
    L'algorithme est un peu difficile à t'expliquer comme ça, vite fait. Et puis, je n'ai pas de code directement exploitable sous la main ... (heureusement car je me ferais encore engue... par Wallace ).
    Conclusion :
    Tu devrais t'intéresser aux tris "fichiers",voir si tu n'y trouves pas ce dont tu as besoin ou bien, SI TES FICHIERS NE SONT PAS TROP LONGS (quelques centaines, voire milliers de lignes, ...), et si tu as la possibilité de copier tout le fichier dans un tableau de chaines (ex. : Dim TabTempo() As String), alors tu peux appliquer mon algorithme de tri.
    Dans ce cas, mes codes d'extraction de la date d'un bout de chaine, de retournement de la date sous forme d'entier long, et de comparaison, sont toujours utilisables. La permutation est à adapter dans le genre TabTempo(i), TabTempo(i+1), ...
    Une fois le tri fini, il n'y a plus qu'à détruire le fichier source et le recommencer en enregistrant toute les lignes du tableau TabTempo().
    J'espère que ça t'aidera.
    Bon travail,

  16. #16
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 904
    Points : 10 168
    Points
    10 168
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    Personnellement, je passerais par la loi du moindre effort (enfin avec l'habitude). Je mettrais mes données dams une DataTable.et je trierais dans un DataView. On peut choisir la colonne et l'ordre de tri. Si les données ne changent pas, on peut les enregistrer et relire avec un fichier XML et 2 lignes de code.
    À ma connaissance, le seul personnage qui a été diagnostiqué comme étant allergique au mot effort. c'est Gaston Lagaffe.

    Ô Saint Excel, Grand Dieu de l'Inutile.

    Excel n'a jamais été, n'est pas et ne sera jamais un SGBD, c'est pour cela que Excel s'appelle Excel et ne s'appelle pas Access junior.

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 428
    Points : 86
    Points
    86
    Par défaut
    merci pour vos réponse, je vais essayer comme vous dites phyl, merci

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

Discussions similaires

  1. Trier une liste par date
    Par autre dans le forum C
    Réponses: 10
    Dernier message: 12/02/2012, 22h16
  2. Grouper les données d'une listview par date
    Par mounaje dans le forum VB.NET
    Réponses: 3
    Dernier message: 08/12/2010, 14h23
  3. Trier une Listview (Colonne numérique/ Date)
    Par Marc_27 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 07/04/2009, 17h53
  4. trier une colonne par date
    Par Patnel dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 02/06/2008, 08h30
  5. Trier une colonne par date
    Par foobar42 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 11/07/2006, 17h46

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