【问题标题】:Sorting listview using combobox使用组合框对列表视图进行排序
【发布时间】:2014-04-24 09:43:29
【问题描述】:

如何使用外部组件对列表视图值进行排序?这意味着,用户不是单击列表视图的标题,而是选择为用户可以排序的某个标题提供服务的组合框值。我在列表视图中有大约 6 列。我只需要通过选择组合框来对这个列表视图进行排序,然后我将编写一个代码来根据 combobox1.text 值对列表视图进行排序。有什么想法吗?

【问题讨论】:

    标签: vb.net listview sorting


    【解决方案1】:

    你需要写一个实现System.Collection.IComparer的类, 并根据您的下拉值制定比较规则。 那么您需要使用您编写的比较器的实例设置 listview ListViewItemSorter 属性,并调用它的 Sort 方法。

    【讨论】:

    • 如果是这样,那么它比将标题设置为可点击要复杂得多吗?我的意思是我可以在 listview 函数中进行编码,而不是创建一个 IComparer 类,因为我主要在互联网上看到了我的问题的结果。我希望在功能内更容易控制。谢谢大佬
    • 实现 IComparer 接口非常容易。它只有一个名为 Compare 的方法,它返回一个介于 -1 和 1 之间的整数。然后您所要做的就是调用 Microsoft 的好人已经实现的 sort 方法。绝对比自己编写排序更容易......当然,设置列表标题可点击甚至更容易:-)
    【解决方案2】:

    我终于找到了我的问题的答案。我要做的是为 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
    

    此排序将对列表视图中的所有列进行排序。感谢互联网连接程序员:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-11
      • 1970-01-01
      • 2012-05-07
      • 1970-01-01
      • 2017-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多