vb.net VB 如何按升序和降序对ListView 进行排序
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/47363879/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
VB How to sort ListView in ascending and descending order
提问by Adam
I cannot figure out why this is not working. I have a ListViewthat I would like to be able to sort in both ascending and descending order. It appears when stepping through the code line by line that all goes well except lvItems.Sortingwill not equal Descending. It is in a constant loop between None{0} and Ascending{1}.
我无法弄清楚为什么这不起作用。我有一个ListView我希望能够按升序和降序排序。当逐行执行代码时,一切顺利,除了lvItems.Sorting不会相等Descending。它处于 None{0} 和 Ascending{1} 之间的恒定循环中。
Here is the Form class:
这是表单类:
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
And here is the ListViewItemComparerClass:
这是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
No matter what data I put in I only seem to get ascending order. Let me know if more information is necessary.
无论我输入什么数据,我似乎都只能得到升序。如果需要更多信息,请告诉我。
采纳答案by Adam
I was able to resolve issue thanks to @jmcilhinney's comment. Instead of using both Sortingand ListViewItemSorter, I created a string variable orderingand assigned it the appropriate sort order (see below for final solution).
感谢@jmcilhinney 的评论,我能够解决问题。我没有同时使用Sortingand 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()
回答by Jordi Prat
If you have created a string variable ordering, you need change the ListViewItemComparer class.
如果您创建了字符串变量排序,则需要更改 ListViewItemComparer 类。
Public Class 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
End Class
结束班

