【问题标题】:vb.net sort listview followed by coloring alternate rows not workingvb.net 排序列表视图后跟着色交替行不起作用
【发布时间】:2020-12-30 21:02:59
【问题描述】:

我可以让我的列表视图交替彩色行或排序,但不能同时进行。在交替行着色导致行的颜色混乱之前,排序似乎不完整,但在列表视图中排序。在调用我的函数 SetAlternateColors 之前,如何确保 listviewItemSorter 已完成?

    lvGedcom.ListViewItemSorter = New ListViewComparer(0, SortOrder.Ascending)
    lvGedcom.Sort()
    InfraT.SetAlternateColor(lvGedcom)

排序后我尝试了睡眠,但无济于事......

    Public Shared Sub SetAlternateColor(sender As Object)
    'Set color striping on listview
    For i As Integer = 0 To sender.Items.Count - 1 Step 2
        sender.Items(i).BackColor = Color.LightGoldenrodYellow
        If i < sender.items.Count - 1 Then
            sender.Items(i + 1).BackColor = SystemColors.Window
        End If
    Next
End Sub

自定义排序器来自:http://www.vb-helper.com/howto_net_listview_sort_clicked_column.html

Class ListViewComparer
Implements IComparer

Private m_ColumnNumber As Integer
Private m_SortOrder As SortOrder

Public Sub New(ByVal column_number As Integer, ByVal _
    sort_order As SortOrder)
    m_ColumnNumber = column_number
    m_SortOrder = sort_order
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 item_x As ListViewItem = DirectCast(x,
        ListViewItem)
    Dim item_y As ListViewItem = DirectCast(y,
        ListViewItem)

    ' Get the sub-item values.
    Dim string_x As String
    If item_x.SubItems.Count <= m_ColumnNumber Then
        string_x = ""
    Else
        string_x = item_x.SubItems(m_ColumnNumber).Text
    End If

    Dim string_y As String
    If item_y.SubItems.Count <= m_ColumnNumber Then
        string_y = ""
    Else
        string_y = item_y.SubItems(m_ColumnNumber).Text
    End If

    ' Compare them.
    If m_SortOrder = SortOrder.Ascending Then
        If IsNumeric(string_x) And IsNumeric(string_y) _
            Then
            Return Val(string_x).CompareTo(Val(string_y))
        ElseIf IsDate(string_x) And IsDate(string_y) _
            Then
            Return DateTime.Parse(string_x).CompareTo(DateTime.Parse(string_y))
        Else
            Return String.Compare(string_x, string_y)
        End If
    Else
        If IsNumeric(string_x) And IsNumeric(string_y) _
            Then
            Return Val(string_y).CompareTo(Val(string_x))
        ElseIf IsDate(string_x) And IsDate(string_y) _
            Then
            Return DateTime.Parse(string_y).CompareTo(DateTime.Parse(string_x))
        Else
            Return String.Compare(string_y, string_x)
        End If
    End If
End Function
End Class

任何帮助都会很棒!

【问题讨论】:

  • 您是否尝试过在Sort() 之后调用Refresh()(应该不需要,但还是试试吧)。将sender As Object 更改为sender As ListView。使用SortOrder.Ascending,您是返回-string.Compare() 还是设置Sorting 属性?你能展示你的自定义比较器吗?顺便说一句,这显然是 WinForms 的 ListView,但无论如何你都应该标记你的问题。
  • 请注意,将Sorting 属性设置为非SortOrder.None 的值会导致控件重新创建句柄。
  • Jimi - 尝试刷新无济于事。我在这里得到的自定义比较器 - vb-helper.com/howto_net_listview_sort_clicked_column.html。排序正确设置为 SortOrder.None。我尝试不使用自定义比较器,只是将排序正确设置为 acsending,但结果相同。
  • 在此处发布您在代码中实际使用的内容,以及与何时/何地/如何使用此代码相关的一些上下文(激活 ListView 排序操作的内容)。线程等的使用。可能,尝试使用从头开始构建的项目并使用标准选项对 ListView 进行排序。看看你是否可以复制问题(我不能)。 -- 我会看看你的比较器,看看有没有什么奇怪的
  • 好的,但是在哪里完成了?在表单的构造函数中?在Load 事件OnLoad 方法中? Shown 事件 OnShown 方法?其他?您使用的是线程还是任务? - 我刚刚测试了你的代码 - 所有这些 - ListView 正在按预期排序和交替颜色。我在Details View 中使用了带有预建 ListViewItems(+ 3 个 SubItems)的 ListView

标签: vb.net sorting listview colors alternate


【解决方案1】:

填充和排序列表视图的调用需要来自加载事件而不是来自新事件,然后它就像一个魅力。感谢 Jimi 的协助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-17
    • 2016-12-23
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    相关资源
    最近更新 更多