sábado, 17 de setembro de 2011

Colocar em ordem alfabética os itens de uma ListView

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