2014-04-24 55 views
0

如何使用外部組件排序列表視圖值?這意味着,用戶不要點擊listview的標題,而是選擇服務於用戶可以排序的某個標題的組合框值。我在列表視圖中有大約6列。我只需要通過選擇組合框來排序此列表視圖,然後我將編寫一個代碼來對基於combobox1.text的列表視圖進行排序。任何想法?使用組合框排序列表視圖

回答

0

您需要編寫一個實現System.Collection.IComparer, 的類,並根據您的下拉值具有您的比較規則。 然後你需要用你寫的比較器的實例設置listview ListViewItemSorter屬性,並將其稱爲Sort方法。

+0

如果是這樣,那麼它是比設置標頭是可點擊的很複雜嗎?我的意思是我可以在listview函數內編寫代碼,而不是創建一個IComparer類,因爲我主要在互聯網上看到了我的問題的結果。我希望在這個功能中更容易控制。感謝人 – Luiey

+0

實現IComparer接口非常簡單。它只有一個名爲Compare的方法,它返回一個介於-1和1之間的整數。然後,您只需調用已由Microsoft的好人實施的sort方法。絕對容易,然後自己寫這個排序... 當然,設置列表標題可點擊甚至更容易那麼:-) –

0

我終於找到了我的問題的一些答案。而我所要做的就是在我的評論中創建另一個IComparer類,就像@zohar建議的那樣。請在下面找到我的答案: 我的listview名稱是lvshop。

在類的頂部,這樣聲明:

Imports System 
Imports System.Windows.Forms 
Imports System.Drawing 
Imports System.Collections 

在類中,聲明如下:

Private m_SortingColumn As ColumnHeader 

在Windows負載,我創建了一個列標題:

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) 

在listview事件

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 

此排序將排序列表視圖中的所有列。由於互聯網連接程序員:)