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

Windows Forms Discussion :

[VB.NET]trie colonnes listview (int)


Sujet :

Windows Forms

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 18
    Points : 16
    Points
    16
    Par défaut [VB.NET]trie colonnes listview (int)
    L'objet ListView dispose d'une propriété ListViewItemSorter de type IComparer. Cela permet d'implémenter sa propre gestion du tri.
    Pour ce faire, il faut créer une classe dérivant de IComparer implémentant la méthode Compare.

    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
    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
    Ensuite, il suffit d'intercepter le click sur les colonnes (événement ColumnClick) et d'instancier cette classe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub ListView1_ColumnClick(ByVal sender As System.Object, _
    ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
            If Me.ListView1.Sorting = SortOrder.Ascending Then
                Me.ListView1.Sorting = SortOrder.Descending
            Else
                Me.ListView1.Sorting = SortOrder.Ascending
            End If
            Me.ListView1.ListViewItemSorter = New ListViewItemComparer(e.Column, Me.ListView1.Sorting)
        End Sub
    Remarque : J'effectue ici une comparaison de chaines, il faudra implémenter différement si on compare des nombres par exemple.

    Ceci est un extrait sur developpez.com. Et comme il est dit il ne marche pas vraiment lorsque la colonne de la listview contient des entier. J'ai tenter de modifier tout cela pour trier les nombres avec d'autre algo etc mais je nage completement. Quelqu'un peut-il m'aider svp ? Le but étant de trier les colonnes de la listview comportant des entiers.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Comment est-ce que je peux changer le type ?

  3. #3
    Membre régulier
    Inscrit en
    Avril 2002
    Messages
    643
    Détails du profil
    Informations forums :
    Inscription : Avril 2002
    Messages : 643
    Points : 94
    Points
    94
    Par défaut
    Salut
    j'ai utiliser ce tutoriel pour faire un trie dans ma listview mais il y a un problème avec les nombres , il ne fais pas tris selon la valeur des nombres( ex: 10,3,100,50,27 il les tris comme suivants 10,100,27,3,50)
    est qu'il y a quelque a ajouter a ce code pour faire le tris des nombres ?

  4. #4
    Nouveau Candidat au Club
    Inscrit en
    Octobre 2007
    Messages
    1
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour!
    Je pense qu'il va falloir gérer manuellement le type de vos données

    exemple :
    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
     
    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
    	'String.Compare retourne -1 si la string 1 est en premier alphabétiquement sinon 1
    	Dim s1 as string = CType(x, ListViewItem).SubItems(col).Text
    	Dim s2 as string = CType(y, ListViewItem).SubItems(col).Text
    	dim l as long
    	dim d as double
    	If Long.TryParse(s1, l) AndAlso Long.TryParse(s2, l) Then
    			if Long.parse(s1)<Long.parse(s1) Then
    				If sortOrder = Windows.Forms.SortOrder.Ascending Then
    					return -1
    				Else
    					Return 1
    				End If
    			Else
    				If sortOrder = Windows.Forms.SortOrder.Ascending Then
    					return 1
    				Else
    					Return -1
    				End If
    			End If
    	ElseIf Double.TryParse(s1, d) AndAlso Double.TryParse(s2, dl) Then
    		'Idem avec Double 
    	Else
    		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 If		
    End Function
    Je pense que l'idée est là, il faut tester !

  5. #5
    Futur Membre du Club
    Inscrit en
    Octobre 2011
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    je viens de tester avec le type Integer egalement , mais rien n'a changé, l'alternative que j'ai utilisé est de declarer un
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private ObjectCompare As New CaseInsensitiveComparer dans la class
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjectCompare = New CaseInsensitiveComparer()
    dans le constructeur de la classe
    - et utiliser la fonction Compare comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
            If sortOrder = Windows.Forms.SortOrder.Ascending Then
                Return ObjectCompare.Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)
            Else
                Return ObjectCompare.Compare(CType(y, ListViewItem).SubItems(col).Text, CType(x, ListViewItem).SubItems(col).Text)
            End If
        End Function
    le resultat est ordonnée meme si les valeurs numerique ne sont pas arrangé par valeur croissante ou decroissante ,ils sont ordonnés en Text

    en jouant sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ObjectCompare.Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)
    on peut avoir le bon resultat

  6. #6
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour eclix
    Pour trier une colonne le listview utilise par defaut un tri de chaines "ascii".

    La methode sort par defaut utilise ce type de tri et sur la colonne "zero" c.à.d la principale pas.

    Pour trier les autres colonnes
    voici le premier exemple MSDN qui fait un tri mais type "ascii" sur les autres colonnes grace à une classe implementant l'inteface IComparer comme tu l'as bien dit mais c'est toujours un ordre "ascii" sur les valeurs de la colonne:
    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
     
    '1er exemple MSDN:Tri d'une colonne par defaut comme Text 
    ' c'est un tri "ascii" 
    Imports System
    Imports System.Windows.Forms
    Imports System.Drawing
    Imports System.Collections
    Public Class ListViewSortForm
    	Inherits Form
    	Private listView1 As ListView
     
    	Public Sub New()
    		' Create ListView items to add to the control.
    		Dim listViewItem1 As New ListViewItem(New String() {"Banana", "a", "b", "c"}, -1, Color.Empty, Color.Yellow, Nothing)
    		Dim listViewItem2 As New ListViewItem(New String() {"Cherry", "v", "g", "t"}, -1, Color.Empty, Color.Red, New Font("Microsoft Sans Serif", 8.25F, FontStyle.Regular, GraphicsUnit.Point, CType(0, System.Byte)))
    		Dim listViewItem3 As New ListViewItem(New String() {"Apple", "h", "j", "n"}, -1, Color.Empty, Color.Lime, Nothing)
    		Dim listViewItem4 As New ListViewItem(New String() {"Pear", "y", "u", "i"}, -1, Color.Empty, Color.FromArgb(CType(192, System.Byte), CType(128, System.Byte), CType(156, System.Byte)), Nothing)
     
    		'Initialize the ListView control and add columns to it.
    		Me.listView1 = New ListView
     
    		' Set the initial sorting type for the ListView.
    		Me.listView1.Sorting = SortOrder.None
    		' Disable automatic sorting to enable manual sorting.
    		Me.listView1.View = View.Details
    		' Add columns and set their text.
    		Me.listView1.Columns.Add(New ColumnHeader)
    		Me.listView1.Columns(0).Text = "Column 1"
    		Me.listView1.Columns(0).Width = 100
    		listView1.Columns.Add(New ColumnHeader)
    		listView1.Columns(1).Text = "Column 2"
    		listView1.Columns.Add(New ColumnHeader)
    		listView1.Columns(2).Text = "Column 3"
    		listView1.Columns.Add(New ColumnHeader)
    		listView1.Columns(3).Text = "Column 4"
    		' Suspend control logic until form is done configuring form.
    		Me.SuspendLayout()
    		' Add Items to the ListView control.
    		Me.listView1.Items.AddRange(New ListViewItem() {listViewItem1, listViewItem2, listViewItem3, listViewItem4})
    		' Set the location and size of the ListView control.
    		Me.listView1.Location = New Point(10, 10)
    		Me.listView1.Name = "listView1"
    		Me.listView1.Size = New Size(300, 100)
    		Me.listView1.TabIndex = 0
    		' Enable editing of the items in the ListView.
    		Me.listView1.LabelEdit = True
    		' Connect the ListView.ColumnClick event to the ColumnClick event handler.
    		AddHandler Me.listView1.ColumnClick, AddressOf ColumnClick
     
    		' Initialize the form.
    		Me.ClientSize = New Size(400, 400)
    		Me.Controls.AddRange(New Control() {Me.listView1})
    		Me.Name = "ListViewSortForm"
    		Me.Text = "Sorted ListView Control"
    		' Resume layout of the form.
    		'Me.ResumeLayout(False)
    	End Sub	'New
     
     
    	' ColumnClick event handler.
    	Private Sub ColumnClick(ByVal o As Object, ByVal e As ColumnClickEventArgs)
    		' Set the ListViewItemSorter property to a new ListViewItemComparer 
    		' object. Setting this property immediately sorts the 
    		' ListView using the ListViewItemComparer object.
    		Me.listView1.ListViewItemSorter = New ListViewItemComparer(e.Column)
    	End Sub
     
    End Class
     
    ' Implements the manual sorting of items by columns.
    Class ListViewItemComparer
    	Implements IComparer
     
    	Private col As Integer
     
    	Public Sub New()
    		col = 0
    	End Sub
     
    	Public Sub New(ByVal column As Integer)
    		col = column
    	End Sub
     
    	Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
    	   Implements IComparer.Compare
    		Return [String].Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)
    	End Function
    End Class
    Pour faire un tri -à la fois- avec ordre "numerique" et avec ordre "ascii" suivant la colonne cliquee il faut reamenager la classe qui implement IComparer et lui indiquer dans la prop Tag de la colonne concernee le type de la colonne avec l'indication "Numeric" (on aurait pu mettre ECLIX).
    code reamenager pour notre classe:
    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
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
     
    ' 2er exemple MSDN:precedent exemple modifiee mais cette fois avec un 
    ' -Tri des colonnes d'indices 0 et 1 comme Text  
    ' -Tri des colonnes d'indices 2 et 3 comme nombre entier ou reel
    ' NB: on doit preciser dans la classe  ListViewItemSorter 
    ' l'ordre voulu : ascendant ou descendant.
    Imports System
    Imports System.Windows.Forms
    Imports System.Drawing
    Imports System.Collections
    Public Class ListViewItemSortNumberForm
    	Private listView1 As ListView
     
    	Public Sub New()
     
    		' Cet appel est requis par le Concepteur Windows Form.
    		InitializeComponent()
     
    		' Ajoutez une initialisation quelconque après l'appel InitializeComponent().
     
     
    		' Create ListView items to add to the control.
    		' Ce ListView est rempli avec des nombres
    		Dim listViewItem1 As New ListViewItem(New String() {"Banana", 1, 2, 47.5}, -1, Color.Empty, Color.Yellow, Nothing)
    		Dim listViewItem2 As New ListViewItem(New String() {"Cherry", 4, 31, 3}, -1, Color.Empty, Color.Red, New Font("Microsoft Sans Serif", 8.25F, FontStyle.Regular, GraphicsUnit.Point, CType(0, System.Byte)))
    		Dim listViewItem3 As New ListViewItem(New String() {"Apple", 25, 1, 13.2}, -1, Color.Empty, Color.Lime, Nothing)
    		Dim listViewItem4 As New ListViewItem(New String() {"Pear", 7, 45, 77}, -1, Color.Empty, Color.FromArgb(CType(192, System.Byte), CType(128, System.Byte), CType(156, System.Byte)), Nothing)
     
    		'Initialize the ListView control and add columns to it.
    		Me.listView1 = New ListView
     
    		' Set the initial sorting type for the ListView.
    		Me.listView1.Sorting = SortOrder.None
    		' Disable automatic sorting to enable manual sorting.
    		Me.listView1.View = View.Details
    		' Add columns and set their text.
    		'les colonnes d'indices 0 et 1 sont par DEFAUT TEXT
    		Me.listView1.Columns.Add(New ColumnHeader)
    		Me.listView1.Columns(0).Text = "Column 1"
    		Me.listView1.Columns(0).Width = 100
     
    		Me.listView1.Columns.Add(New ColumnHeader)
    		Me.listView1.Columns(1).Text = "Column 2"
     
    		'les colonnes d'indices 2 et 3 NUMERIQUES ont la prop Tag marque "Numeric"
    		Me.listView1.Columns.Add(New ColumnHeader)
    		Me.listView1.Columns(2).Text = "Column 3"
    		Me.listView1.Columns(2).Tag = "Numeric"
     
    		Me.listView1.Columns.Add(New ColumnHeader)
    		Me.listView1.Columns(3).Text = "Column 4"
    		Me.listView1.Columns(3).Tag = "Numeric"
    		' Suspend control logic until form is done configuring form.
    		Me.SuspendLayout()
    		' Add Items to the ListView control.
    		Me.listView1.Items.AddRange(New ListViewItem() {listViewItem1, listViewItem2, listViewItem3, listViewItem4})
    		' Set the location and size of the ListView control.
    		Me.listView1.Location = New Point(10, 10)
    		Me.listView1.Name = "listView1"
    		Me.listView1.Size = New Size(300, 100)
    		Me.listView1.TabIndex = 0
    		' Enable editing of the items in the ListView.
    		Me.listView1.LabelEdit = True
    		' Connect the ListView.ColumnClick event to the ColumnClick event handler.
    		AddHandler Me.listView1.ColumnClick, AddressOf ColumnClick
     
    		' Initialize the form.
    		Me.ClientSize = New Size(400, 400)
    		Me.Controls.AddRange(New Control() {Me.listView1})
    		Me.Name = "ListViewSortNumberForm"
    		Me.Text = "Sorted ListView Control"
    		' Resume layout of the form.
    		Me.ResumeLayout(False)
     
    	End Sub
     
    	' ColumnClick event handler.
    	Private Sub ColumnClick(ByVal o As Object, ByVal e As ColumnClickEventArgs)
    		' Set the ListViewItemSorter property to a new ListViewItemSorter
    		Me.listView1.ListViewItemSorter = New ListViewItemSorter(e.Column)
    	End Sub
     
    End Class
     
    ' Implements the manual sorting of items by columns.
    Class ListViewItemSorter
    	Implements IComparer
     
    	Private col As Integer
    	'Ordre choisi
    	Public myOrdreTri As SortOrder = SortOrder.Ascending
    	Public Sub New()
    		col = 0
    	End Sub
     
    	Public Sub New(ByVal column As Integer)
    		col = column
    	End Sub
     
    	Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
    	   Implements IComparer.Compare
    		'si type x ou y n'est pas un ListViewItem retour
    		If Not TypeOf (x) Is ListViewItem Then
    			Return 0
    		End If
    		If Not TypeOf (y) Is ListViewItem Then
    			Return 0
    		End If
    		'recupere la paire à trier
    		Dim elem1 As ListViewItem = CType(x, ListViewItem)
    		Dim elem2 As ListViewItem = CType(y, ListViewItem)
    		'si prop Tag ne contient rien on la marque  "Text"
    		If elem1.ListView.Columns(col).Tag Is Nothing Then
    			elem1.ListView.Columns(col).Tag = "Text"
    		End If
    		'la prop Tag  contient indication "Numeric" => c'est un nombre
    		If (elem1.ListView.Columns(col).Tag.ToString = "Numeric") Then
    			Dim nb1 As Double = Double.Parse(elem1.SubItems(col).Text)
    			Dim nb2 As Double = Double.Parse(elem2.SubItems(col).Text)
    			If (myOrdreTri = SortOrder.Ascending) Then
    				Return nb1.CompareTo(nb2)
    			Else
    				Return nb2.CompareTo(nb1)
    			End If
    		Else  'non c'est marque  "Text"
    			Dim str1 As String = elem1.SubItems(col).Text
    			Dim str2 As String = elem2.SubItems(col).Text
    			If (myOrdreTri = SortOrder.Ascending) Then
    				Return str1.CompareTo(str2)
    			Else
    				Return str2.CompareTo(str1)
    			End If
    		End If
     
    	End Function
    End Class
    bon code.......................

Discussions similaires

  1. [Débutant] Trie d'une colonne listview ?!
    Par Badreddines dans le forum VB.NET
    Réponses: 2
    Dernier message: 12/06/2012, 19h04
  2. [VB.NET] Aide sur ListView
    Par vijeo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 13/02/2006, 20h37
  3. [VB.NET] [excel] Colonne excel
    Par mikolirto dans le forum Windows Forms
    Réponses: 27
    Dernier message: 05/04/2005, 10h55
  4. [VB.NET] Convert chaine hexa -> int
    Par Tempotpo dans le forum Windows Forms
    Réponses: 3
    Dernier message: 30/03/2005, 08h53
  5. [C#] Comment faire pour rendre invible une colonne(ListView)
    Par Jfrancois57 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 05/05/2004, 13h27

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