2017-11-18 390 views
0

我不明白为什么这不起作用。我有一个ListView,我希望能够按升序和降序排序。当逐行逐行通过代码时看起来一切顺利,除了lvItems.Sorting将不等于Descending。它在None {0}和Ascending {1}之间处于一个常量循环中。VB如何按升序和降序对ListView进行排序

这里是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 

不管是什么数据我把我只能似乎得到升序排列。让我知道是否有必要提供更多信息。

+1

不要设置'Sorting'和'ListViewItemSorter'。正如文档所述,第一个用于按字母顺序自动排序,第二个用于自定义排序。挑一个并使用它。 – jmcilhinney

回答

0

感谢@ jmcilhinney的评论,我能够解决问题。我没有使用SortingListViewItemSorter,而是创建了一个字符串变量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() 
相关问题