Para colocar em ordem alfabética itens de uma ListView quando o usuário clica
em uma coluna, utilize os códigos abaixo.
Crie uma classe e coloque os seguintes códigos:
Imports System.Collections
Imports System.Windows.Forms
'Estas duas instruções devem ser
colocadas antes de Public Class
Public Class
NomedaClasse
Implements
IComparer
Public Enum
SortOrder
Ascending
Descending
End Enum
Private
mSortColumn As Integer
Private
mSortOrder As
SortOrder
Public Sub New(ByVal
sortColumn As Integer,
ByVal
sortOrder As
SortOrder)
mSortColumn = sortColumn
mSortOrder = sortOrder
End Sub
Public Function
Compare(ByVal
x As Object,
ByVal
y As Object)
As Integer Implements
System.Collections.IComparer.Compare
Dim
Result As Integer
Dim
ItemX As
ListViewItem
Dim
ItemY As
ListViewItem
ItemX = CType(x,
ListViewItem)
ItemY = CType(y,
ListViewItem)
If
mSortColumn = 0 Then
Result = DateTime.Compare(CType(ItemX.Text,
DateTime),
CType(ItemY.Text,
DateTime))
Else
Result = DateTime.Compare(CType(ItemX.SubItems(mSortColumn).Text,
DateTime),
CType(ItemY.SubItems(mSortColumn).Text,
DateTime))
End If
If
mSortOrder = SortOrder.Descending
Then
Result = -Result
End If
Return
Result
End Function
End Class
Public Class
ListViewStringSort
Implements
IComparer
Private
mSortColumn As Integer
Private
mSortOrder As
SortOrder
Public Sub New(ByVal
sortColumn As Integer,
ByVal
sortOrder As
SortOrder)
mSortColumn = sortColumn
mSortOrder = sortOrder
End Sub
Public Function
Compare(ByVal
x As Object,
ByVal
y As Object)
As Integer Implements
System.Collections.IComparer.Compare
Dim
Result As Integer
Dim
ItemX As
ListViewItem
Dim
ItemY As
ListViewItem
ItemX = CType(x,
ListViewItem)
ItemY = CType(y,
ListViewItem)
If
mSortColumn = 0 Then
Result = ItemX.Text.CompareTo(ItemY.Text)
Else
Result =
ItemX.SubItems(mSortColumn).Text.CompareTo(ItemY.SubItems(mSortColumn).Text)
End If
If
mSortOrder = SortOrder.Descending
Then
Result = -Result
End If
Return
Result
End Function
End Class
Public Class
ListViewNumericSort
Implements
IComparer
Private
mSortColumn As Integer
Private
mSortOrder As
SortOrder
Public Sub New(ByVal
sortColumn As Integer,
ByVal
sortOrder As
SortOrder)
mSortColumn = sortColumn
mSortOrder = sortOrder
End Sub
Public Function
Compare(ByVal
x As Object,
ByVal
y As Object)
As Integer Implements
System.Collections.IComparer.Compare
Dim
Result As Integer
Dim
ItemX As
ListViewItem
Dim
ItemY As
ListViewItem
ItemX = CType(x,
ListViewItem)
ItemY = CType(y,
ListViewItem)
If
mSortColumn = 0 Then
Result = Decimal.Compare(CType(ItemX.Text,
Decimal),
CType(ItemY.Text,
Decimal))
Else
Result = Decimal.Compare(CType(ItemX.SubItems(mSortColumn).Text,
Decimal),
CType(ItemY.SubItems(mSortColumn).Text,
Decimal))
End If
If
mSortOrder = SortOrder.Descending
Then
Result = -Result
End If
Return
Result
End Function
End Class
Public Class
ListViewDateSort
Implements
IComparer
Private
mSortColumn As Integer
Private
mSortOrder As
SortOrder
Public Sub New(ByVal
sortColumn As Integer,
ByVal
sortOrder As
SortOrder)
mSortColumn = sortColumn
mSortOrder = sortOrder
End Sub
Public Function
Compare(ByVal
x As Object,
ByVal
y As Object)
As Integer Implements
System.Collections.IComparer.Compare
Dim
Result As Integer
Dim
ItemX As
ListViewItem
Dim
ItemY As
ListViewItem
ItemX = CType(x,
ListViewItem)
ItemY = CType(y,
ListViewItem)
If
mSortColumn = 0 Then
Result = DateTime.Compare(CType(ItemX.Text,
DateTime),
CType(ItemY.Text,
DateTime))
Else
Result = DateTime.Compare(CType(ItemX.SubItems(mSortColumn).Text,
DateTime),
CType(ItemY.SubItems(mSortColumn).Text,
DateTime))
End If
If
mSortOrder = SortOrder.Descending
Then
Result = -Result
End If
Return
Result
End Function
End Class
Em um módulo coloque os códigos abaixo:
Friend Sub
SortMyListView(ByVal
ListViewToSort As
ListView,
ByVal
ColumnNumber As Integer,
Optional ByVal
Resort As Boolean
= False,
Optional ByVal
ForceSort As Boolean
= False)
Dim
SortOrder As
SortOrder
Static
LastSortColumn As Integer
= -1
Static
LastSortOrder As
SortOrder
= SortOrder.Ascending
If
Resort = True Then
SortOrder = LastSortOrder
Else
If
LastSortColumn = ColumnNumber
Then
If
LastSortOrder = SortOrder.Ascending
Then
SortOrder =
SortOrder.Descending
Else
SortOrder =
SortOrder.Ascending
End If
Else
SortOrder =
SortOrder.Ascending
End If
End If
If String.IsNullOrEmpty(CStr(ListViewToSort.Columns(ColumnNumber).Tag))
Then
If
ForceSort = True Then
ListViewToSort.Columns(ColumnNumber).Tag =
"String"
Else
Exit Sub
End If
End If
Select Case
ListViewToSort.Columns(ColumnNumber).Tag.ToString
Case
"Numeric"
ListViewToSort.ListViewItemSorter =
New
ListViewNumericSort(ColumnNumber,
SortOrder)
Case
"Date"
ListViewToSort.ListViewItemSorter =
New
ListViewDateSort(ColumnNumber,
SortOrder)
Case
"String"
ListViewToSort.ListViewItemSorter =
New
ListViewStringSort(ColumnNumber,
SortOrder)
End Select
LastSortColumn = ColumnNumber
LastSortOrder = SortOrder
ListViewToSort.ListViewItemSorter =
Nothing
End Sub
No evento ColumnClick do ListView coloque o código abaixo:
Private Sub
ListView1_ColumnClick(ByVal
sender As Object,
ByVal
e As
System.Windows.Forms.ColumnClickEventArgs)
Handles
ListView.ColumnClick
SortMyListView(Me.ListView1,
e.Column, , True)
End Sub
Achei estes códigos há algum tempo, não me lembro de onde para colocar os
créditos aqui.
Simples, não?
Nenhum comentário:
Postar um comentário