В winform, как добавить функцию столбца сортировки в столбцы listview?

#.net #vb.net #winforms #listview #sorting

#.net #vb.net #winforms #listview #сортировка

Вопрос:

В winform, как добавить функцию столбца сортировки в столбцы listview?

Я не смог найти какое-либо свойство для столбца, которое позволяет>

Спасибо

Комментарии:

1. Вот хорошая статья на MSDN, в которой объясняется, как это сделать: Сортировка элементов ListView по столбцам с помощью Windows Forms

Ответ №1:

Вы должны написать свой собственный класс, который реализует IComparer .

Затем вы пишете метод Compare, который реализуется IComparer.Compare в этом классе.

Ниже приведен пример того, который я написал некоторое время назад, который сортирует по номеру, дате или строке, но вы можете изменить это для собственного использования:

 Public Class ListViewComparer
    Implements IComparer

    Private _columnNumber As Integer
    Private _sortOrder As SortOrder

    Public Sub New(ByVal colIndex As Integer, ByVal sortingOrder As SortOrder)
        _columnNumber = colIndex
        _sortOrder = sortingOrder
    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 itemX As ListViewItem = DirectCast(x, ListViewItem)
        Dim itemY As ListViewItem = DirectCast(y, ListViewItem)
        Dim stringX As String = "", stringY As String = ""
        ' Get the sub-item values.

        If itemX.SubItems.Count > _columnNumber Then stringX = itemX.SubItems(_columnNumber).Text
        If itemY.SubItems.Count > _columnNumber Then stringY = itemY.SubItems(_columnNumber).Text

        ' Compare them.
        If _sortOrder = SortOrder.Ascending Then
            If IsNumeric(stringX) And IsNumeric(stringY) Then
                Return CInt(stringX).CompareTo(CInt(stringY))
            ElseIf IsDate(stringX) And IsDate(stringY) Then
                Return DateTime.Parse(stringX).CompareTo(DateTime.Parse(stringY))
            Else
                Return String.Compare(stringX, stringY)
            End If
        Else
            If IsNumeric(stringX) And IsNumeric(stringY) Then
                Return CInt(stringY).CompareTo(CInt(stringX))
            ElseIf IsDate(stringX) And IsDate(stringY) Then
                Return DateTime.Parse(stringY).CompareTo(DateTime.Parse(stringX))
            Else
                Return String.Compare(stringY, stringX)
            End If
        End If
    End Function
End Class
  

Использование:

 ListViewControl1.ListViewItemSorter = New ListViewComparer(2, SortOrder.Ascending)
ListViewControl1.Sort()
  

Комментарии:

1. Нет, вам нужно будет вызвать код сортировки в событии `ListView1.ColumnClick` и передать e.Column значение

2. хорошо, это работает. Но, как управлять как возрастанием, так и убыванием .. при соответствующем нажатии.

3. вам нужно отслеживать, в каком направлении вы в данный момент производите сортировку, и изменять ее при нажатии на тот же столбец. Если вы нажмете на другой столбец, установите для него значение по возрастанию