【发布时间】: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 正在按预期排序和交替颜色。我在DetailsView 中使用了带有预建 ListViewItems(+ 3 个 SubItems)的 ListView
标签: vb.net sorting listview colors alternate