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 :

Problème de tri dans une listview [Débutant]


Sujet :

VB.NET

  1. #1
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 70

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 301
    Points : 130
    Points
    130
    Par défaut Problème de tri dans une listview
    Bonjour
    J'utilise une seule listview qui change de contenu en cliquant sur des boutons radio
    J'ai trouvé sur le net une procédure pour trier la liste en cliquant sur les entêtes de colonnes
    ça fonctionne mais si je trie ma liste et qu'ensuite je clique sur mes boutons radio pour en afficher un autre contenu, j'ai l'erreur suivante

    InvalidArgument=La valeur '1' n'est pas valide pour 'index'.
    Nom du paramètre : index


    Si je fais un tri seulement avec la première colonne je n'ai pas d'erreur
    Je vous joint le code de ce form .... si vous pouviez m'aider, merci

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    Imports System
    Imports System.Data
    Imports System.Data.OleDb
    Imports Microsoft.VisualBasic
     
    Public Class FilmsIncomplets
        Inherits System.Windows.Forms.Form
        Class ListViewItemComparer
            Implements IComparer
            Private col As Integer
            Private sortOrder As SortOrder
     
            Public Sub New()
                col = 0
                sortOrder = Windows.Forms.SortOrder.Ascending
            End Sub
     
            Public Sub New(ByVal column As Integer)
                col = column
                sortOrder = Windows.Forms.SortOrder.Ascending
            End Sub
     
            Public Sub New(ByVal column As Integer, ByVal s As SortOrder)
                col = column
                sortOrder = s
            End Sub
     
            Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
                If sortOrder = Windows.Forms.SortOrder.Ascending Then
                    Return String.Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)
                Else
                    Return String.Compare(CType(y, ListViewItem).SubItems(col).Text, CType(x, ListViewItem).SubItems(col).Text)
                End If
     
            End Function
     
        End Class
        Public Function Init_ListBA()
            ListView.Items.Clear()
            ListView.Columns.Clear()
            Dim MyConnexion As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" & _
                         "C:\Access\DvdData.mdb")
            Dim Mycommand As OleDbCommand = MyConnexion.CreateCommand()
     
            Mycommand.CommandText = "SELECT RéfCollectionVidéo,TitreFilm,AnnéeSortie,PrésenceVidéo FROM Vidéo" & _
            " WHERE PrésenceVidéo = False ORDER BY TitreFilm"
     
            MyConnexion.Open()
     
            Dim myReader As OleDbDataReader = Mycommand.ExecuteReader()
            ListView.View = View.Details
            With ListView.Columns
                .Add("N°", 45, HorizontalAlignment.Left)
                .Add("Titre du film", 305, HorizontalAlignment.Left)
                .Add("Année", 45, HorizontalAlignment.Left)
            End With
     
     
            Do While myReader.Read()
                Dim _MyListViewItem As ListViewItem = ListView.Items.Add(Format(myReader.GetValue(0), "000"))
                With _MyListViewItem
                    .SubItems.Add(myReader.GetValue(1).ToString)
                    .SubItems.Add(myReader.GetValue(2).ToString)
                End With
            Loop
            myReader.Close()
            MyConnexion.Close()
            Return Nothing
        End Function
        Public Function Init_ListeMusique()
            ListView.Items.Clear()
            ListView.Columns.Clear()
            Dim MyConnexion As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data source=" & _
                         "C:\Access\DvdData.mdb")
            Dim Mycommand As OleDbCommand = MyConnexion.CreateCommand()
     
            Mycommand.CommandText = "SELECT RéfCollectionVidéo,TitreFilm,Musique,PrésenceMusiqueFilm FROM Vidéo" & _
            " WHERE PrésenceMusiqueFilm = False ORDER BY TitreFilm"
     
            MyConnexion.Open()
     
            Dim myReader As OleDbDataReader = Mycommand.ExecuteReader()
            ListView.View = View.Details
            With ListView.Columns
                .Add("N°", 45, HorizontalAlignment.Left)
                .Add("Titre du film", 250, HorizontalAlignment.Left)
                .Add("Compositeur", 100, HorizontalAlignment.Left)
            End With
     
     
            Do While myReader.Read()
                Dim _MyListViewItem As ListViewItem = ListView.Items.Add(Format(myReader.GetValue(0), "000"))
                With _MyListViewItem
                    .SubItems.Add(myReader.GetValue(1).ToString)
                    .SubItems.Add(myReader.GetValue(2).ToString)
                End With
            Loop
     
            myReader.Close()
     
            MyConnexion.Close()
            Return Nothing
        End Function
        Private Sub FilmsIncomplets_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Init_ListBA()
        End Sub
     
        Private Sub RadioButtonBA_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButtonBA.CheckedChanged
            Init_ListBA()
        End Sub
     
        Private Sub RadioButtonMusique_CheckedChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles RadioButtonMusique.CheckedChanged
            Init_ListeMusique()
        End Sub
        Private Sub ListView_ColumnClick(ByVal sender As System.Object, _
        ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView.ColumnClick
            If Me.ListView.Sorting = SortOrder.Ascending Then
                Me.ListView.Sorting = SortOrder.Descending
            Else
                Me.ListView.Sorting = SortOrder.Ascending
            End If
            Me.ListView.ListViewItemSorter = New ListViewItemComparer(e.Column, Me.ListView.Sorting)
        End Sub
    End Class

  2. #2
    Membre éprouvé

    Homme Profil pro
    Inscrit en
    Mars 2012
    Messages
    691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Israël

    Informations forums :
    Inscription : Mars 2012
    Messages : 691
    Points : 929
    Points
    929
    Par défaut
    Salut

    d'abord quelle est la structure de ta listview selon quelle colonne tu veux
    trier ?

  3. #3
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 70

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 301
    Points : 130
    Points
    130
    Par défaut
    Bonjour
    Qu'appelles-tu structure de ma ListView ?
    Je veux trier sur nimporte qu'elle des 3 colonnes

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Quelle est la ligne qui plante ?

    eb.

  5. #5
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 70

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 301
    Points : 130
    Points
    130
    Par défaut
    Bonjour
    Comment fait on pour voir quelle ligne plante ?
    Je ne maitrise pas encore bien le debbogage

  6. #6
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Tu peux mettre un point d'arrêt sur tes fonctions et exécuter pas à pas.
    Je te conseille le cours de philippe Lasserre. N'hésite pas à le parcourir, c'est une mine d'informations qui t'aideront dans ton dev.

    eb.

  7. #7
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 70

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 301
    Points : 130
    Points
    130
    Par défaut
    Bonjour
    C'est sur la ligne 30 que ça plante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Return String.Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)
    J'ai fait différents essais

    Quand je trie sur la colonne 1 ça marche
    quand je trie sur la colonne 2 j'ai cette erreur

    InvalidArgument=La valeur '1' n'est pas valide pour 'index'.
    Nom du paramètre : index

    Quand je trie sur la colonne 3 j'ai cette erreur
    InvalidArgument=La valeur '2' n'est pas valide pour 'index'.
    Nom du paramètre : index

    J'ai l'impression que c'est un problème d'index de colonnes au niveau de la listview

  8. #8
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    Bonjour,
    Le problème est lié au fait que lorsque tu reconstruits ton ListView après l'avoir trié une première fois, à chaque insertion d'un item, le ListView est retrié.
    Comme l'insertion est effectué par la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim _MyListViewItem As ListViewItem = ListView.Items.Add(Format(myReader.GetValue(0), "000"))
    Au premier appel, pas de problème (l'item est tout seul) mais après l'insertion du second, l'item n'a pas de Subitems (il sont insérés ensuite) et là, le drame éclate car la classe effectuant le tri fait référence aux SubItems.

    Tu as donc 2 solutions :
    Créer l'item et les SubItems puis une fois la création effectuée les affecter au ListView :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Do While myReader.Read()
       Dim _MyListViewItem As ListViewItem = New ListViewItem(Format(myReader.GetValue(0), "000"))
       With _MyListViewItem
          .SubItems.Add(myReader.GetValue(1).ToString)
          .SubItems.Add(myReader.GetValue(2).ToString)
       End With
       ListView.Items.Add(_MyListViewItem)
    Loop
    Ou bien positionner la proriété Sorting du ListView à SortOrder.None avant la reconstruction. Dans ce cas, le ListView ne sera pas trié au fur et à mesure de sa construction.

    Pour info : Lorsque tu remplis un ListView, il est conseillé d'utiliser ListView.BeginUpdate (avant modification) et ListView.EndUpdate (après les insertions) afin que le dessin ne soit effectué qu'a la fin des insertions. Performance !!
    Aussi : Lors d'un debug ou d'un plantage, tu peux consulter la pile d'appels. Elle t'indique les procédures et fonctions appelantes. Cela t'aurait permis de voir que c'est lors de l'insertion d'un item que ton programme plante.
    Enfin : Dans les propriétés du projet positionne "Option Strict" à "On" (et pas Off). Cela te permettra de voir que tes fonctions sont définies sans valeur de retour . (Remarque, elles retournent Nothing à chaque fois, donc pourquoi ne pas utiliser une Sub ?).

    Bon courage.
    eb.

  9. #9
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 70

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 301
    Points : 130
    Points
    130
    Par défaut
    Bonjour
    Merci de tous ces conseils
    Maintenant ça ne plante plus !
    Par contre au changement de liste avec les boutons radio le tri de la liste est conservé
    Il n'est pas tenu compte du tri imposé dans la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Mycommand.CommandText = "SELECT RéfCollectionVidéo,TitreFilm,Musique,PrésenceMusiqueFilm FROM Vidéo" & _
                                    " WHERE PrésenceMusiqueFilm = False ORDER BY TitreFilm"

  10. #10
    Membre expérimenté
    Homme Profil pro
    Développeur .Net / Delphi
    Inscrit en
    Juillet 2002
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Développeur .Net / Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2002
    Messages : 738
    Points : 1 745
    Points
    1 745
    Par défaut
    A partir du moment où tu as défini la propriété ListViewItemSorter du ListView, le gestionnaire de tri sera utilisé à l'appel de la méthode Sort() et lors de l'ajout d'un item (voir msdn).
    Donc, même si la requête trie les éléments, ils seront retrier à l'insertion dans le ListView (ce que j'indique dans mon précédent message ...)
    Pour resoudre le problème, utilise la seconde méthode que j'ai indiqué :
    positionner la proriété Sorting du ListView à SortOrder.None avant la reconstruction. Dans ce cas, le ListView ne sera pas trié au fur et à mesure de sa construction.
    Tu peux aussi faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.ListView.ListViewItemSorter = Nothing
    eb.

  11. #11
    Membre habitué
    Inscrit en
    Mai 2004
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 70

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2004
    Messages : 301
    Points : 130
    Points
    130
    Par défaut
    Bonjour
    Encore Merci à ebastien
    Je positionne la balise Résolu

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

Discussions similaires

  1. Problème d'affichage dans une ListView
    Par tabbabi dans le forum Composants graphiques
    Réponses: 2
    Dernier message: 10/08/2011, 12h58
  2. [AC-2007] Problème de tri dans une table
    Par JAG747 dans le forum Modélisation
    Réponses: 5
    Dernier message: 04/02/2011, 14h25
  3. Fonction de tri dans une ListView
    Par megamario dans le forum VB.NET
    Réponses: 4
    Dernier message: 16/06/2010, 16h32
  4. Problème de filtre dans une ListView
    Par Thrud dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 30/04/2008, 16h10
  5. Tri dans une ListView
    Par essadiki_ista dans le forum VB.NET
    Réponses: 6
    Dernier message: 02/06/2007, 10h56

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