Posted under Visual Basic
Hepimizin bildigi gibi listview nesnesinde kolon icerigi sayi yada tarih olsa bile listview bu icerigi string olarak kabul edip siralamaktadir.
Asagidaki fonksiyon ve örnek kodlar bu sorunun cozumu icin gelistirilmistir.
Asagidaki fonksiyonu bir module yada form objesinin kod kismina kopyalayiniz.
Fonksiyon
Option Explicit
Public Sub SortListView(ListViewObject As ListView, _
ByVal ColumnHeader As MSComctlLib.ColumnHeader)
‘**********************************************************************
‘Purpose : Sort list view items
‘Input : ListView object, Selected column
‘ ListViewObject : ListView object
‘ ColumnHeader : Selected column
‘Output : -
‘Return value : -
‘Date : 23.09.2003
‘Author : Algorithm : Iuri Applonio
‘ Code : Murat Aras
‘Modification : -
‘**********************************************************************
Dim strItem As String ‘List item
Dim intMaxItemLength As Integer ‘Max. length of list items
Dim intCounter As Integer ‘Counter
With ListViewObject
’Set sorted property of listview
.Sorted = False
’Add temporary column to sort
.ColumnHeaders.Add , , , 0
’Select first item from list view
’If first column
If ColumnHeader.Index = 1 Then
strItem = .ListItems(1)
’If another column
Else
strItem = .ListItems(1).SubItems(ColumnHeader.Index - 1)
End If
End With
’Date type?
If IsDate(strItem) Then
With ListViewObject
’If first column
If ColumnHeader.Index = 1 Then
For intCounter = 1 To .ListItems.Count
’Get list item
strItem = Trim(.ListItems(intCounter))
’Add list item to last column in new format to sort
.ListItems(intCounter).SubItems(.ColumnHeaders.Count - 1) = Format(strItem, “yyyymmddHHMMSS”)
Next
’If another column
Else
For intCounter = 1 To .ListItems.Count
’Get sub item
strItem = Trim(.ListItems(intCounter).SubItems(ColumnHeader.Index - 1))
’Add sub item to last column in new format to sort
.ListItems(intCounter).SubItems(.ColumnHeaders.Count - 1) = Format(strItem, “yyyymmddHHMMSS”)
Next
End If
’Set sort key property (temporary column)
.SortKey = .ColumnHeaders.Count - 1
End With
’Numberic type?
ElseIf IsNumeric(strItem) Then
With ListViewObject
’Set start up value for maximum length of items
intMaxItemLength = 0
’If first column
If ColumnHeader.Index = 1 Then
’Find max. length of items
For intCounter = 1 To .ListItems.Count
strItem = Trim(Replace(Replace(.ListItems(intCounter), “,”, “”), “.”, “”))
If Len(strItem) > intMaxItemLength Then
intMaxItemLength = Len(strItem)
End If
Next
For intCounter = 1 To .ListItems.Count
’Get sub item
strItem = Trim(Replace(Replace(.ListItems(intCounter), “,”, “”), “.”, “”))
’Add sub item to last column in new format to sort
.ListItems(intCounter).SubItems(.ColumnHeaders.Count - 1) = “0″ & String(intMaxItemLength - Len(strItem), “0″) & strItem
Next
’If another column
Else
’Find max. length of items
For intCounter = 1 To .ListItems.Count
strItem = Trim(Replace(Replace(.ListItems(intCounter).SubItems(ColumnHeader.Index - 1), “,”, “”), “.”, “”))
If Len(strItem) > intMaxItemLength Then
intMaxItemLength = Len(strItem)
End If
Next
For intCounter = 1 To .ListItems.Count
’Get sub item
strItem = Trim(Replace(Replace(.ListItems(intCounter).SubItems(ColumnHeader.Index - 1), “,”, “”), “.”, “”))
’Add sub item to last column in new format to sort
.ListItems(intCounter).SubItems(.ColumnHeaders.Count - 1) = “0″ & String(intMaxItemLength - Len(strItem), “0″) & strItem
Next
End If
’Set sort key property (temporary column)
.SortKey = .ColumnHeaders.Count - 1
End With
’Another type?
Else
ListViewObject.SortKey = ColumnHeader.Index - 1
End If
’Set properties of list view
With ListViewObject
’Change the sort order
.SortOrder = 1 - .SortOrder
’Set sorted property
.Sorted = True
’Remove temporary column
.ColumnHeaders.Remove .ColumnHeaders.Count
End With
End Sub
Ornek kullanim
Bir form uzerine bir listview nesnesi koyarak asagidaki kodu form objesinin kod bolumune yapistiriniz ve projeyi calistiriniz.
Option Explicit
Private Sub Form_Load()
’Kolonlari ekliyoruz
With ListView1.ColumnHeaders
.Add , , “Text Kolon”, 2000
.Add , , “Number Kolon”, 2000
.Add , , “Date Kolon”, 2000
End With
’Elemanlari ekliyoruz
With ListView1
.ListItems.Add , , “A”
With .ListItems(.ListItems.Count)
.SubItems(1) = “1″
.SubItems(2) = “20.01.2003″
End With
.ListItems.Add , , “B”
With .ListItems(.ListItems.Count)
.SubItems(1) = “10″
.SubItems(2) = “21.01.2003″
End With
.ListItems.Add , , “C”
With .ListItems(.ListItems.Count)
.SubItems(1) = “100″
.SubItems(2) = “22.01.2003″
End With
.ListItems.Add , , “D”
With .ListItems(.ListItems.Count)
.SubItems(1) = “2″
.SubItems(2) = “10.02.2003″
End With
.ListItems.Add , , “D”
With .ListItems(.ListItems.Count)
.SubItems(1) = “20″
.SubItems(2) = “11.02.2003″
End With
.ListItems.Add , , “E”
With .ListItems(.ListItems.Count)
.SubItems(1) = “200″
.SubItems(2) = “12.02.2003″
End With
.ListItems.Add , , “F”
With .ListItems(.ListItems.Count)
.SubItems(1) = “3″
.SubItems(2) = “01.03.2003″
End With
.ListItems.Add , , “G”
With .ListItems(.ListItems.Count)
.SubItems(1) = “30″
.SubItems(2) = “02.03.2003″
End With
.ListItems.Add , , “H”
With .ListItems(.ListItems.Count)
.SubItems(1) = “300″
.SubItems(2) = “03.03.2003″
End With
End With
’Gorunumu rapor olarak atiyoruz
ListView1.View = lvwReport
End Sub
Private Sub ListView1_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
‘List view siralama algoritmasi
’With ListView1
’ .SortKey = ColumnHeader.Index - 1
’ .SortOrder = 1 - .SortOrder
’ .Sorted = True
’End With
‘Yeni list view siralama algoritmasi
SortListView ListView1, ColumnHeader
End Sub
ListView1_ColumnClick olayinda kesmeleri kaldirarak ve yer degistirerek normal siralama algoritmasi ile yazmis oldugumuz siralama algoritmasi arasindaki farklari gorebilirsiniz.