Flo*_*ter 2 vb.net sorting listview
我正在写一个家庭作业计划,我有一个 ListView 元素。
我正在寻找一个代码片段,当我点击列标题时,它允许我按字母顺序排列列。如果已经按升序排序,则切换到降序,反之亦然,然后按默认/第一个排序,即下面屏幕截图中的“状态”。
我用谷歌搜索过,没有找到我可以用的东西,你能帮我吗?

Private Sub ColumnClick(ByVal sender As Object, _
ByVal e As System.Windows.Forms.ColumnClickEventArgs) _
Handles lvKalender.ColumnClick
Select Case e.Column
' Nach Namen sortieren
Case 0
If lvKalender.Columns.Item(0).ListView.Sorting <> SortOrder.Descending Then
lvKalender.Columns.Item(0).ListView.Sorting = SortOrder.Descending
ElseIf lvKalender.Columns.Item(0).ListView.Sorting <> SortOrder.Ascending Then
lvKalender.Columns.Item(0).ListView.Sorting = SortOrder.Ascending
End If
Case 1
If (1).ListView.Sorting <> SortOrder.Descending Then
lvKalender.Columns.Item(1).ListView.Sorting = SortOrder.Descending
ElseIf lvKalender.Columns.Item(1).ListView.Sorting <> SortOrder.Ascending Then
lvKalender.Columns.Item(1).ListView.Sorting = SortOrder.Ascending
End If
Case 2
If lvKalender.Columns.Item(2).ListView.Sorting <> SortOrder.Descending Then
lvKalender.Columns.Item(2).ListView.Sorting = SortOrder.Descending
ElseIf lvKalender.Columns.Item(2).ListView.Sorting <> SortOrder.Ascending Then
lvKalender.Columns.Item(2).ListView.Sorting = SortOrder.Ascending
End If
Case 3
If lvKalender.Columns.Item(3).ListView.Sorting <> SortOrder.Descending Then
lvKalender.Columns.Item(3).ListView.Sorting = SortOrder.Descending
ElseIf lvKalender.Columns.Item(3).ListView.Sorting <> SortOrder.Ascending Then
lvKalender.Columns.Item(3).ListView.Sorting = SortOrder.Ascending
End If
Case 4
If lvKalender.Columns.Item(4).ListView.Sorting <> SortOrder.Descending Then
lvKalender.Columns.Item(4).ListView.Sorting = SortOrder.Descending
ElseIf lvKalender.Columns.Item(4).ListView.Sorting <> SortOrder.Ascending Then
lvKalender.Columns.Item(4).ListView.Sorting = SortOrder.Ascending
End If
Case 5
If lvKalender.Columns.Item(5).ListView.Sorting <> SortOrder.Descending Then
lvKalender.Columns.Item(5).ListView.Sorting = SortOrder.Descending
ElseIf lvKalender.Columns.Item(5).ListView.Sorting <> SortOrder.Ascending Then
lvKalender.Columns.Item(5).ListView.Sorting = SortOrder.Ascending
End If
Case 6
If lvKalender.Columns.Item(6).ListView.Sorting <> SortOrder.Descending Then
lvKalender.Columns.Item(6).ListView.Sorting = SortOrder.Descending
ElseIf lvKalender.Columns.Item(6).ListView.Sorting <> SortOrder.Ascending Then
lvKalender.Columns.Item(6).ListView.Sorting = SortOrder.Ascending
End If
End Select
End Sub
Run Code Online (Sandbox Code Playgroud)
如果我理解您的问题,您想在ListView. 问题是 a 中的所有内容ListView都是字符串/文本。一些子项(cols)可能看起来像日期,但这只是因为这是你的大脑翻译/解释它们的方式——它们实际上是字符串。
这样做的影响是对包含数字的文本进行排序很少有效。例如,"90"将始终排序高于"300"因为"9"> "3",并且"19.08.2014"将排序高于"10.01.2019"。数字和数字的价值是不一样的。
要按文本以外的内容排序,您需要一个ListViewItemSorter. 这是日期:
Friend Class ListViewItemDateComparer
Implements IComparer
Private col As Integer
Private _sort As SortOrder = SortOrder.Ascending
Public Sub New(column As Integer, sort As Windows.Forms.SortOrder)
col = column
_sort = sort
End Sub
Public Function Compare(x As Object,
y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim returnVal As Integer = -1
' parse LV contents back to DateTime value
Dim dtX As DateTime = DateTime.Parse(CType(x, ListViewItem).SubItems(col).Text)
Dim dtY As DateTime = DateTime.Parse(CType(y, ListViewItem).SubItems(col).Text)
' compare
returnVal = DateTime.Compare(dtX, dtY)
If _sort = SortOrder.Descending Then
returnVal *= -1
End If
Return returnVal
End Function
End Class
Run Code Online (Sandbox Code Playgroud)
要使用它:
Dim LVSorter = New ListViewItemDateComparer(COL_TO_SORT, Sort_Order)
myLV.ListViewItemSorter = LVSorter
Run Code Online (Sandbox Code Playgroud)
COL_TO_SORT 将是您希望排序的包含日期的列/子项索引。
Sort_Order将是标准的 WinForms SortOrder(SortOrder.Ascending等)
Decimal例如,要比较其他数据类型,请克隆Comparer并更改进行比较的 3 行:
' parse LV contents back to Decimal value
Dim dtX As Decimal = Decimal.Parse(CType(x, ListViewItem).SubItems(col).Text)
Dim dtY As Decimal = Decimal.Parse(CType(y, ListViewItem).SubItems(col).Text)
' compare
returnVal = Decimal.Compare(dtX, dtY)
Run Code Online (Sandbox Code Playgroud)