vb.net 单击标题时如何对 Listview 列进行排序

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/25382209/
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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-17 18:03:47  来源:igfitidea点击:

How to sort Listview columns when the header is clicked

vb.netlistviewsorting

提问by Florian Hofmeister

I'm writing a homework planner and I have a ListView element.

我正在写一个家庭作业计划,我有一个 ListView 元素。

I'm looking for a code snippet that allows me to arrange the columns in alphabetical order when I click on the column header. If it is already sorted in ascending order, then switch to descending and vice versa, then sort by the default/first one, i.e. "status" in the screenshot below.

我正在寻找一个代码片段,当我点击列标题时,它允许我按字母顺序排列列。如果已经按升序排序,则切换到降序,反之亦然,然后按默认/第一个排序,即下面屏幕截图中的“状态”。

I have googled and have found nothing I could use, can you help me?

我用谷歌搜索过,没有找到我可以用的东西,你能帮我吗?

screenshot

截屏

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

回答by ??ssa P?ngj?rdenlarp

If I understand your problem, you want to sort a column of Dates (and perhaps some values???) in a ListView. The problem is that everything in a ListViewis string/text. Some subitems (cols) may looklike dates, but that is just because that is how your brain translates/interprets them - they are actually strings.

如果我理解您的问题,您想在ListView. 问题是 a 中的所有内容ListView都是字符串/文本。一些子项目(cols)可能看起来像日期,但这只是因为这是你的大脑翻译/解释它们的方式——它们实际上是字符串。

The impact of this is that sorting text which has numbers rarely works out. For example, "90"will always sort higher than "300"because "9"> "3", and "19.08.2014"will sort higher than "10.01.2019". The value of numeralsand numbersis not the same.

这样做的影响是对包含数字的文本进行排序很少有效。例如,"90"将始终排序高于"300"因为"9"> "3",并且"19.08.2014"将排序高于"10.01.2019"数字数字的价值是不一样的。

To sort by something other than a text, you need a ListViewItemSorter. This one is for dates:

要按文本以外的内容排序,您需要一个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

To use it:

要使用它:

Dim LVSorter = New ListViewItemDateComparer(COL_TO_SORT, Sort_Order)
myLV.ListViewItemSorter = LVSorter

COL_TO_SORTwould be the column/subitem index you wish to sort which contains Dates.

COL_TO_SORT将是您希望排序的包含日期的列/子项索引。

Sort_Orderwould be the standard WinForms SortOrder (SortOrder.Ascendingetc)

Sort_Order将是标准的 WinForms SortOrder(SortOrder.Ascending等)



To compare other data types, Decimalfor example, clone the Comparerand change the 3 lines doing the comparing:

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)

回答by Anton Opic

Private Sub ColumnClick(ByVal sender As Object, _
    ByVal e As System.Windows.Forms.ColumnClickEventArgs) _
    Handles lvKalender.ColumnClick

 If lvKalender.Columns.Item(e.Column).ListView.Sorting <> SortOrder.Descending Then
     lvKalender.Columns.Item(e.Column).ListView.Sorting = SortOrder.Descending
  ElseIf lvKalender.Columns.Item(e.Column).ListView.Sorting <> SortOrder.Ascending Then
     lvKalender.Columns.Item(e.Column).ListView.Sorting = SortOrder.Ascending
 End If

End Sub

回答by Anton Opic

Private Sub ListViewProcess_ColumnClick(sender As Object, e As ColumnClickEventArgs) Handles ListViewProcess.ColumnClick
    sender.AutoResizeColumn(e.Column, ColumnHeaderAutoResizeStyle.HeaderSize)
    If sender.Columns.Item(e.Column).ListView.Sorting <> SortOrder.Descending Then
        sender.Columns.Item(e.Column).ListView.Sorting = SortOrder.Descending
    ElseIf sender.Columns.Item(e.Column).ListView.Sorting <> SortOrder.Ascending Then
        sender.Columns.Item(e.Column).ListView.Sorting = SortOrder.Ascending
    End If
End Sub