Ik heb een listview mewt bijv. de volgende gegevens
Aantal Verpakking Naam:
9 1 smit
12 3
8 2
Als ik deze sorteer op de normale wijze met ascending enz. dan krijg ik nummeriek niet de juiste volgorde.
Ik heb dit opgelost door op de lisviewcolom te klikken.
en de class
Dit werkt prima, maar het volgende zou ik graag willen.
Deze code in de loadevent zetten, zodat als ik de lijst opstart deze al automatich wordt gesorteerd (aflopend)
Eventueel deze aan een button hangen zou ook kunnen, wie kan mij hier mee helpen
Aantal Verpakking Naam:
9 1 smit
12 3
8 2
Als ik deze sorteer op de normale wijze met ascending enz. dan krijg ik nummeriek niet de juiste volgorde.
Ik heb dit opgelost door op de lisviewcolom te klikken.
Code:
Private Sub ListView1_ColumnClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
Dim new_sorting_column As ColumnHeader = _
ListView1.Columns(e.Column)
Dim sort_order As System.Windows.Forms.SortOrder
If m_SortingColumn Is Nothing Then
sort_order = SortOrder.Ascending
Else
If new_sorting_column.Equals(m_SortingColumn) Then
If m_SortingColumn.Text.StartsWith("> ") Then
sort_order = SortOrder.Descending
Else
sort_order = SortOrder.Ascending
End If
Else
sort_order = SortOrder.Ascending
End If
m_SortingColumn.Text = _
m_SortingColumn.Text.Substring(2)
End If
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
ListView1.ListViewItemSorter = New _
listviewcomparer(e.Column, sort_order)
ListView1.Sort()
End Sub
en de class
Code:
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
Dit werkt prima, maar het volgende zou ik graag willen.
Deze code in de loadevent zetten, zodat als ik de lijst opstart deze al automatich wordt gesorteerd (aflopend)
Eventueel deze aan een button hangen zou ook kunnen, wie kan mij hier mee helpen