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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 428
    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 expérimenté Avatar de Delaney
    Homme Profil pro
    Developpeur VB amateur
    Inscrit en
    Mars 2014
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    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
    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 éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

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

  4. #4
    Membre Expert 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
    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 éclairé
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 428
    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 Expert 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
    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 ...

+ 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