【发布时间】:2014-04-24 09:43:29
【问题描述】:
如何使用外部组件对列表视图值进行排序?这意味着,用户不是单击列表视图的标题,而是选择为用户可以排序的某个标题提供服务的组合框值。我在列表视图中有大约 6 列。我只需要通过选择组合框来对这个列表视图进行排序,然后我将编写一个代码来根据 combobox1.text 值对列表视图进行排序。有什么想法吗?
【问题讨论】:
如何使用外部组件对列表视图值进行排序?这意味着,用户不是单击列表视图的标题,而是选择为用户可以排序的某个标题提供服务的组合框值。我在列表视图中有大约 6 列。我只需要通过选择组合框来对这个列表视图进行排序,然后我将编写一个代码来根据 combobox1.text 值对列表视图进行排序。有什么想法吗?
【问题讨论】:
你需要写一个实现System.Collection.IComparer的类, 并根据您的下拉值制定比较规则。 那么您需要使用您编写的比较器的实例设置 listview ListViewItemSorter 属性,并调用它的 Sort 方法。
【讨论】:
我终于找到了我的问题的答案。我要做的是为 IComparer 创建另一个类,正如@zohar 在我的评论中建议的那样。请在下面找到我的答案: 我的列表视图名称是 lvshop。
在类的顶部,声明:
Imports System
Imports System.Windows.Forms
Imports System.Drawing
Imports System.Collections
在类中声明:
Private m_SortingColumn As ColumnHeader
在加载窗口时,我创建了一个列标题:
lvShop.View = View.Details
lvShop.Columns.Add("Shop No", 70, HorizontalAlignment.Left)
lvShop.Columns.Add("Shop Name", 170, HorizontalAlignment.Left)
lvShop.Columns.Add("Shop Details", 500, HorizontalAlignment.Left)
lvShop.Columns.Add("Category", 100, HorizontalAlignment.Left)
lvShop.Columns.Add("Website", 170, HorizontalAlignment.Left)
lvShop.Columns.Add("Phone No", 100, HorizontalAlignment.Left)
在列表视图事件中
Private Sub lvShop_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles lvShop.ColumnClick
Dim new_sorting_column As ColumnHeader = lvShop.Columns(e.Column)
Try
' Figure out the new sorting order.
Dim sort_order As System.Windows.Forms.SortOrder
If m_SortingColumn Is Nothing Then
' New column. Sort ascending.
sort_order = SortOrder.Ascending
Else
' See if this is the same column.
If new_sorting_column.Equals(m_SortingColumn) Then
' Same column. Switch the sort order.
If m_SortingColumn.Text.StartsWith("> ") Then
sort_order = SortOrder.Descending
Else
sort_order = SortOrder.Ascending
End If
Else
' New column. Sort ascending.
sort_order = SortOrder.Ascending
End If
' Remove the old sort indicator.
m_SortingColumn.Text = _
m_SortingColumn.Text.Substring(2)
End If
' Display the new sort order.
m_SortingColumn = new_sorting_column
If sort_order = SortOrder.Ascending Then
m_SortingColumn.Text = "> " & m_SortingColumn.Text
Else
m_SortingColumn.Text = "< " & m_SortingColumn.Text
End If
' Create a comparer.
lvShop.ListViewItemSorter = New ListViewColumnSorter(e.Column, sort_order)
' Sort.
lvShop.Sort()
Catch ex As Exception
strErrMsg = "Oops! Something is wrong with sorting column header."
MessageBox.Show(strErrMsg & vbCrLf & "Err: " & ex.Message)
End Try
End Sub
在项目中创建一个名为ListViewColumnSorter的新类
将其复制并粘贴到课程中。
Imports System.Collections
Imports System.Windows.Forms
Public Class ListViewColumnSorter
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
此排序将对列表视图中的所有列进行排序。感谢互联网连接程序员:)
【讨论】: