我无法弄清楚为什么这不起作用。我有一个ListView
,我希望能够按升序和降序排序。当逐行逐步执行代码时,除非lvItems.Sorting
不等于Descending
,否则会出现一切顺利。它位于None {0}和Ascending {1}之间的常量循环中。
这是Form类:
Private Sub lvItems_ColumnClick(sender As Object, e As System.Windows.Forms.ColumnClickEventArgs) Handles lvItems.ColumnClick
' If current column is not the previously clicked column
' Add
If e.Column <> sortColumn Then
' Set the sort column to the new column
sortColumn = e.Column
'Default to ascending sort order
lvItems.Sorting = SortOrder.Ascending
Else
'Flip the sort order
If lvItems.Sorting = SortOrder.Ascending Then
lvItems.Sorting = SortOrder.Descending
Else
lvItems.Sorting = SortOrder.Ascending
End If
End If
'Set the ListviewItemSorter property to a new ListviewItemComparer object
Me.lvItems.ListViewItemSorter = New ListViewItemComparer(e.Column, lvItems.Sorting)
' Call the sort method to manually sort
lvItems.Sort()
End Sub
这是ListViewItemComparer
班级:
Public 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(column As Integer, order As SortOrder)
col = column
Me.order = order
End Sub
Public Function Compare(x As Object, y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim returnVal As Integer = -1
Try
' Attempt to parse the two objects as DateTime
Dim firstDate As System.DateTime = DateTime.Parse(CType(x, ListViewItem).SubItems(col).Text)
Dim secondDate As System.DateTime = DateTime.Parse(CType(y, ListViewItem).SubItems(col).Text)
' Compare as date
returnVal = DateTime.Compare(firstDate, secondDate)
Catch ex As Exception
' If date parse failed then fall here to determine if objects are numeric
If IsNumeric(CType(x, ListViewItem).SubItems(col).Text) And
IsNumeric(CType(y, ListViewItem).SubItems(col).Text) Then
' Compare as numeric
returnVal = Val(CType(x, ListViewItem).SubItems(col).Text).CompareTo(Val(CType(y, ListViewItem).SubItems(col).Text))
Else
' If not numeric then compare as string
returnVal = [String].Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)
End If
End Try
' If order is descending then invert value
If order = SortOrder.Descending Then
returnVal *= -1
End If
Return returnVal
End Function
End Class
无论我输入什么数据,我似乎只是升序。如果有必要提供更多信息,请与我联系。
答案 0 :(得分:0)
由于@ jmcilhinney的评论,我能够解决问题。我没有同时使用Sorting
和ListViewItemSorter
,而是创建了一个字符串变量ordering
,并为其分配了相应的排序顺序(请参阅下面的最终解决方案)。
'If current column is not the previously clicked column
'Add
If e.Column <> sortColumn Then
' Set the sort column to the new column
sortColumn = e.Column
'Default to ascending sort order
ordering = "Ascending"
Else
'Flip the sort order
If ordering = "Ascending" Then
ordering = "Descending"
Else
ordering = "Ascending"
End If
End If
'Set the ListviewItemSorter property to a new ListviewItemComparer object
lvItems.ListViewItemSorter = New ListViewItemComparer(e.Column, ordering)
'Call the sort method to manually sort
lvItems.Sort()
答案 1 :(得分:0)
如果创建了字符串变量排序,则需要更改ListViewItemComparer类。
公共类ListViewItemComparer
Implements IComparer
Private col As Integer
Private order As String
Public Sub New()
col = 0
order = "Ascending"
End Sub
Public Sub New(column As Integer, order As String)
col = column
Me.order = order
End Sub
Public Function Compare(x As Object, y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim returnVal As Integer = -1
Try
' Attempt to parse the two objects as DateTime
Dim firstDate As System.DateTime = DateTime.Parse(CType(x, ListViewItem).SubItems(col).Text)
Dim secondDate As System.DateTime = DateTime.Parse(CType(y, ListViewItem).SubItems(col).Text)
' Compare as date
returnVal = DateTime.Compare(firstDate, secondDate)
Catch ex As Exception
' If date parse failed then fall here to determine if objects are numeric
If IsNumeric(CType(x, ListViewItem).SubItems(col).Text) And
IsNumeric(CType(y, ListViewItem).SubItems(col).Text) Then
' Compare as numeric
returnVal = Val(CType(x, ListViewItem).SubItems(col).Text).CompareTo(Val(CType(y, ListViewItem).SubItems(col).Text))
Else
' If not numeric then compare as string
returnVal = [String].Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)
End If
End Try
' If order is descending then invert value
If order = "Descending" Then
returnVal *= -1
End If
Return returnVal
End Function
结束班级