어떻게 외부 컴포넌트를 사용하여리스트 뷰 값을 정렬 할 수 있습니까? 즉, 사용자가 listview의 헤더를 클릭하지 않고 사용자가 정렬 할 수있는 특정 헤더를 제공하는 콤보 박스 값을 선택합니다. 나는 listview에 약 6 열을 가지고있다. 난 그냥 콤보 박스를 선택 하여이 listview 정렬해야하고 내가 combobox1.text 값을 기반으로 listview 정렬 코드를 작성합니다 .. 어떤 생각?콤보 박스를 사용하여리스트 뷰 정렬
0
A
답변
0
System.Collection.IComparer, 을 구현하는 클래스를 작성하고 드롭 다운 값을 기반으로 비교 규칙을 만들어야합니다. 그러면 ListView ListViewItemSorter 속성을 작성한 비교 자의 인스턴스로 설정하고 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
이 정렬은 목록보기의 모든 열을 정렬합니다. 프로그래머 연결을위한 인터넷 덕분에 :)
관련 문제
- 1. 현재 PHP에서 콤보 박스를 선택했습니다.
- 2. wpf에서 콤보 박스를 만들고 싶습니다.
- 3. Extjs - 콤보 박스를 채우지 않는다.
- 4. 콤보 박스를 Excel에 작성하여 필터링하십시오.
- 5. jQuery 대상 콤보 박스를 숨기기
- 6. 계단식 콤보 박스를 작동시키지 못함
- 7. 콤보 박스를 다른 DataContext에 바인딩
- 8. 콤보 박스를 사용하여 선택 VB
- 9. 자바 스크립트에서 콤보 박스를 확인하십시오.
- 10. windows 콤보 박스를 동적으로 채우십시오.
- 11. 조회 콤보 박스를 어떻게 바인딩합니까?
- 12. flowlayoutpanel에 동적으로 콤보 박스를 추가하십시오.
- 13. 콤보 박스를 채우는 동안 혼란
- 14. viewmodel에서 콤보 박스를 만들 수 있습니다.
- 15. 안드로이드 - 단편과 간단한 커서 어댑터를 사용하여리스트 뷰 채우기
- 16. Haskell - 함수를 사용하여리스트 만들기
- 17. ocaml List.map을 사용하여리스트 반복하기
- 18. ggplot을 사용하여리스트 객체를 그렸습니다.
- 19. ExtJS는 다른 콤보 박스의 콤보 박스를 채 웁니다. 선택한 레코드
- 20. 콤보 박스를 선택하는 경우 콤보 박스에서 데이터베이스 값을 표시하는 방법
- 21. 알파벳순으로 콤보 상자 정렬
- 22. 라벨과 텍스트 박스를 수직으로 정렬
- 23. 콤보 박스 안에 체크 박스를 추가하는 법 #
- 24. jquery ui 콤보 박스를 사용할 때의 문제
- 25. Gtk에서 이미지로 콤보 박스를 만드는 방법은 무엇입니까?
- 26. 콤보 박스를 사용하여 텍스트 줄을 지정하는 방법
- 27. 콤보 박스를 클릭하면 로딩이 나타납니다. 어떻게 피합니까?
- 28. Pyqt에서 읽기 전용 콤보 박스를 만들려면 어떻게해야합니까?
- 29. extjs에서 콤보 박스를 동적으로 숨기거나 표시하기
- 30. DataGrid 콤보 박스를 객체가 작동하지 않게 바인딩합니다.
그렇다면, 클릭이 가능하도록 헤더를 설정하는 것보다 훨씬 복잡합니까? 나는 내가 인터넷에서 대부분 내 질문의 결과를 보았을 때 IComparer 클래스를 생성하기보다는 listview 함수 내에서 코드를 작성할 수 있다는 것을 의미한다. 함수 내에서 더 쉽게 제어 할 수 있기를 바랍니다. 감사합니다 사람 – Luiey
IComparer 인터페이스를 구현하는 것은 매우 쉽습니다. Compare라는 단일 메서드 만 가지고 -1에서 1 사이의 정수를 반환합니다. 그러면 Microsoft의 좋은 사람들이 이미 구현 한 sort 메서드를 호출하면됩니다. 확실히 쉽게 자신의 정렬을 작성하는 것이 더 쉽습니다 ... 물론 목록 헤더를 클릭 가능으로 설정하는 것이 훨씬 쉽습니다. –