2014-04-24 4 views
0

어떻게 외부 컴포넌트를 사용하여리스트 뷰 값을 정렬 할 수 있습니까? 즉, 사용자가 listview의 헤더를 클릭하지 않고 사용자가 정렬 할 수있는 특정 헤더를 제공하는 콤보 박스 값을 선택합니다. 나는 listview에 약 6 열을 가지고있다. 난 그냥 콤보 박스를 선택 하여이 listview 정렬해야하고 내가 combobox1.text 값을 기반으로 listview 정렬 코드를 작성합니다 .. 어떤 생각?콤보 박스를 사용하여리스트 뷰 정렬

답변

0

System.Collection.IComparer, 을 구현하는 클래스를 작성하고 드롭 다운 값을 기반으로 비교 규칙을 만들어야합니다. 그러면 ListView ListViewItemSorter 속성을 작성한 비교 자의 인스턴스로 설정하고 Sort 메서드를 호출해야합니다.

+0

그렇다면, 클릭이 가능하도록 헤더를 설정하는 것보다 훨씬 복잡합니까? 나는 내가 인터넷에서 대부분 내 질문의 결과를 보았을 때 IComparer 클래스를 생성하기보다는 listview 함수 내에서 코드를 작성할 수 있다는 것을 의미한다. 함수 내에서 더 쉽게 제어 할 수 있기를 바랍니다. 감사합니다 사람 – Luiey

+0

IComparer 인터페이스를 구현하는 것은 매우 쉽습니다. Compare라는 단일 메서드 만 가지고 -1에서 1 사이의 정수를 반환합니다. 그러면 Microsoft의 좋은 사람들이 이미 구현 한 sort 메서드를 호출하면됩니다. 확실히 쉽게 자신의 정렬을 작성하는 것이 더 쉽습니다 ... 물론 목록 헤더를 클릭 가능으로 설정하는 것이 훨씬 쉽습니다. –

0

나는 마침내 내 질문에 대한 답을 찾았습니다. 그리고 내가해야 할 일은 IComparer에 대한 또 다른 클래스를 만드는 것입니다. @ zohar는 제 코멘트에서 제안합니다. 내 대답을 아래에서 찾으십시오. 내 목록보기 이름은 lvshop입니다.

클래스의 상단에

,이 선언 : 클래스 내에서

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

는이 선언

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 m_SortingColumn As ColumnHeader 

을, 나는 열 머리글을 만들 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 

이 정렬은 목록보기의 모든 열을 정렬합니다. 프로그래머 연결을위한 인터넷 덕분에 :)

관련 문제