Basicfarmer
asked on
Need some help with a ListView comparer Class
Experts, I have this Listview Comparer Class that i have found and it works really well for most of my columns. However it does not seem to work correctly on columns where the data is formatted as currency. Can you please show me how to modify this class to sort currency columns properly?
Thanks...
Thanks...
'*******************************************************************************************************
'* This class was found on http://http://www.vb-helper.com/howto_net_listview_sort_clicked_column.html *
'* Thanks to Kevin G for the improved caomparison code that tests numeric values as numbers rather *
'* strings. (For example, as strings "9" comes after "100". But as numbers "9" comes before "100".) *
'* Thanks to Joe Mestrovich for adding support for date columns. (For example, as strings "10/10/2000" *
'* comes before "1/1/1999". But as dates "10/10/2000" comes after "1/1/1999". Also as strings *
'* "01/20/2009" comes before "1/1/2009". But as dates "01/20/2009" comes after "1/1/2009".) *
'* No modifications have been made to this class. *
'*******************************************************************************************************
Public Class ListViewComparer
Implements IComparer
Private m_ColumnNumber As Integer
Private m_SortOrder As SortOrder
Public Sub New(ByVal column_number As Integer, ByVal sort_order As SortOrder)
m_ColumnNumber = column_number
m_SortOrder = sort_order
End Sub
' Compare the items in the appropriate column
' for objects x and y.
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim item_x As ListViewItem = DirectCast(x, ListViewItem)
Dim item_y As ListViewItem = DirectCast(y, ListViewItem)
' Get the sub-item values.
Dim string_x As String
If item_x.SubItems.Count <= m_ColumnNumber Then
string_x = ""
Else
string_x = item_x.SubItems(m_ColumnNumber).Text
End If
Dim string_y As String
If item_y.SubItems.Count <= m_ColumnNumber Then
string_y = ""
Else
string_y = item_y.SubItems(m_ColumnNumber).Text
End If
' Compare them.
If m_SortOrder = SortOrder.Ascending Then
If IsNumeric(string_x) And IsNumeric(string_y) Then
Return Val(string_x).CompareTo(Val(string_y))
ElseIf IsDate(string_x) And IsDate(string_y) Then
Return DateTime.Parse(string_x).CompareTo(DateTime.Parse(string_y))
Else
Return String.Compare(string_x, string_y)
End If
Else
If IsNumeric(string_x) And IsNumeric(string_y) Then
Return Val(string_y).CompareTo(Val(string_x))
ElseIf IsDate(string_x) And IsDate(string_y) Then
Return DateTime.Parse(string_y).CompareTo(DateTime.Parse(string_x))
Else
Return String.Compare(string_y, string_x)
End If
End If
End Function
End Class
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER