Volledige versie bekijken : Listview colom sorteren, niet alfabetisch, DATUM



Y-Ssin
25 April 2010, 23:19
Heb heb een listview die ik als volgt sorteer:



Class ListViewItemComparer
Implements IComparer
Private col As Integer
Private order As SortOrder

Public Sub New()
col = 0
order = SortOrder.Ascending
End Sub

Public Sub New(ByVal column As Integer, ByVal order As SortOrder)
col = column
Me.order = order
End Sub

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
Implements System.Collections.IComparer.Compare

Dim returnVal As Integer = -1
returnVal = [String].Compare(CType(x, _
ListViewItem).SubItems(col).Text, _
CType(y, ListViewItem).SubItems(col).Text)
If order = SortOrder.Descending Then
returnVal *= -1
End If

Return returnVal
End Function
End Class

Private sortColumn As Integer = -1
Private Sub listView1_ColumnClick(ByVal sender As Object, ByVal e As _
System.Windows.Forms.ColumnClickEventArgs) Handles lsvTaken.ColumnClick
If e.Column <> sortColumn Then
sortColumn = e.Column
lsvTaken.Sorting = SortOrder.Ascending
Else
If lsvTaken.Sorting = SortOrder.Ascending Then
lsvTaken.Sorting = SortOrder.Descending
Else
lsvTaken.Sorting = SortOrder.Ascending
End If
End If
lsvTaken.Sort()
lsvTaken.ListViewItemSorter = New ListViewItemComparer(e.Column, lsvTaken.Sorting)

End Sub


Nu heb ik ergens een kolom waar data in staan, en ik wil die ook kunnen sorteren, maar als ik op die kolom druk komt dinsdag eerst eerst dan donderdag,...
mijn data komen van een datetimpicker een staan er dus zo op: zondag 25 april 2010
Iemand die me hiermee kan helpen?

ultddave
25 April 2010, 23:56
Yep dat komt hij die als strings ziet en dus lexicografisch gaat vergelijken. Waardoor ze dus alfabetisch staan. Je moet die strings dan handmatig omzetten naar een "datum". En dan de datums vergelijken.

Omzetten;


Dim dateArray() As String = Split(Me.TextBox1.Text)
Dim day, month, year As Integer

day = dateArray(1)
month = getMonth(dateArray(2))
year = dateArray(3)



Me.TextBox1.Text moet je vervangen door de string van de datum. Bijvoorbeeld "zondag 25 april 2010".



Private Function getMonth(ByRef month As String) As Integer
month = month.ToLower()
Select Case month
Case "januari"
Return 1
Case "februari"
Return 2
Case "maart"
Return 3
Case "april"
Return 4
Case "mei"
Return 5
Case "juni"
Return 6
Case "juli"
Return 7
Case "augustus"
Return 8
Case "september"
Return 9
Case "oktober"
Return 10
Case "november"
Return 11
Case "december"
Return 12
Case Else
Return 1
End Select
End Function

Die 3 integers (day, month, year) kan je dan gebruiken om een Date of Datetime object te maken.



Dim x As New Date(year, month, day)
Dim x As New DateTime(year, month, day)


Mvg,
Dave

ultddave
26 April 2010, 13:17
Dit is opgelost. ;) (Geholpen via msn)

Er waren nog wat problemen bij het feit dat de listview soms strings en soms listviewitems doorgaf aan de compare functie. (Echt vreemd dat hij dat soms afwisselde)

Maar met wat exception handling is het opgelost geraakt.

Mvg,
Dave