VB如何按升序和降序对ListView进行排序

时间:2017-11-18 07:54:35

标签: vb.net sorting listview

我无法弄清楚为什么这不起作用。我有一个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

无论我输入什么数据,我似乎只是升序。如果有必要提供更多信息,请与我联系。

2 个答案:

答案 0 :(得分: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()

答案 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

结束班级