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 |
Partager