Have now got the sort working by date using code below
The code also sorts by A-Z, numerically or by date if needed
Added this into my main form to allow sorting by clicking on a column:-
Private m_SortingColumn As ColumnHeader Private Sub ListView1_ColumnClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick ' Get the new sorting column. Dim new_sorting_column As ColumnHeader = ListView1.Columns(e.Column) ' Figure out the new sorting order. Dim sort_order As System.Windows.Forms.SortOrder If m_SortingColumn Is Nothing Then ' New column. Sort ascending. sort_order = SortOrder.Ascending Else ' See if this is the same column. If new_sorting_column.Equals(m_SortingColumn) Then ' Same column. Switch the sort order. If m_SortingColumn.Text.StartsWith("> ") Then sort_order = SortOrder.Descending Else sort_order = SortOrder.Ascending End If Else ' New column. Sort ascending. sort_order = SortOrder.Ascending End If ' Remove the old sort indicator. m_SortingColumn.Text = m_SortingColumn.Text.Substring(2) End If ' Display the new sort order. m_SortingColumn = new_sorting_column If sort_order = SortOrder.Ascending Then m_SortingColumn.Text = "> " & m_SortingColumn.Text Else m_SortingColumn.Text = "< " & m_SortingColumn.Text End If ' Create a comparer. ListView1.ListViewItemSorter = New clsListviewSorter(e.Column, sort_order) ' Sort. ListView1.Sort() End Sub
This uses the following class file called clsListviewSorter.vb:-
Public Class clsListviewSorter ' Implements a comparer 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 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
And finally added this into my form to automatically sort it initially into date order by column 2 (1)
ListView1.ListViewItemSorter = New clsListviewSorter(1, SortOrder.Ascending) ListView1.Sort()
Darren Rose