7. Visual Basic.NET ListView Nesnesi Sıralama İşlemleri
Listview nesnesi, listitem olarak tanınan satırların TEXT değerlerine göre sıralama yapıyor bildiğiniz gibi. Ama bu sıralamayı sadece STRING kabul ediyor. Örneğin bir tarih sıralatmanız imkansız.
Kendi yazdığım kodlar ile içinden çıkmıştım zamanında ama internette araştırırken çok sağlam bir class ve fonksiyon buldum. Doğrudan onu paylaşacağım.
Öncelikle projenize bir Class oluşturun, ismi "ListViewColumnSorter" olacak ve içine aşağıdaki kodları ekleyin.
Class oluşturulduktan sonra aşağıdaki fonksiyonu ilgili formunuzun içine alınız.
Programcının yazdığı açıklamalardan da anlaşılacağı gibi, listview itemlerinin tutulduğu Column ların her birinin "tag" larını veri türüne uygun şekilde doldurmanız gerekiyor. Tarih için "Date", sayı için "Numeric" ve metin için "String" yazmalısınız. Büyük/Küçük harf önemlidir, birebir yazınız.
Son olarak aşağıdaki gibi basitçe fonksiyonu çağırıyoruz.
Kendi yazdığım kodlar ile içinden çıkmıştım zamanında ama internette araştırırken çok sağlam bir class ve fonksiyon buldum. Doğrudan onu paylaşacağım.
Öncelikle projenize bir Class oluşturun, ismi "ListViewColumnSorter" olacak ve içine aşağıdaki kodları ekleyin.
Imports
System.Collections
Imports
System.Windows.Forms 'BUNLARI UNUTMAYIN
Public Class ListViewColumnSorter
Implements IComparer
Public Enum SortOrder
Ascending
Descending
End Enum
Private
mSortColumn As Integer
Private
mSortOrder As SortOrder
Public Sub New(ByVal sortColumn As Integer, ByVal
sortOrder As SortOrder)
mSortColumn = sortColumn
mSortOrder = sortOrder
End Sub
Public Function Compare(ByVal
x As Object, ByVal y As Object) As Integer Implements
System.Collections.IComparer.Compare
Dim
Result As Integer
Dim
ItemX As ListViewItem
Dim
ItemY As ListViewItem
ItemX = CType(x,
ListViewItem)
ItemY = CType(y,
ListViewItem)
If
mSortColumn = 0 Then
Result = DateTime.Compare(CType(ItemX.Text, DateTime),
CType(ItemY.Text, DateTime))
Else
Result = DateTime.Compare(CType(ItemX.SubItems(mSortColumn).Text, DateTime), CType(ItemY.SubItems(mSortColumn).Text,
DateTime))
End If
If
mSortOrder = SortOrder.Descending Then
Result = -Result
End If
Return
Result
End Function
End Class
Public Class ListViewStringSort
Implements IComparer
Private
mSortColumn As Integer
Private
mSortOrder As SortOrder
Public Sub New(ByVal sortColumn As Integer, ByVal
sortOrder As SortOrder)
mSortColumn = sortColumn
mSortOrder = sortOrder
End Sub
Public Function Compare(ByVal
x As Object, ByVal y As Object) As Integer Implements
System.Collections.IComparer.Compare
Dim
Result As Integer
Dim
ItemX As ListViewItem
Dim
ItemY As ListViewItem
ItemX = CType(x,
ListViewItem)
ItemY = CType(y,
ListViewItem)
If
mSortColumn = 0 Then
Result =
ItemX.Text.CompareTo(ItemY.Text)
Else
Result =
ItemX.SubItems(mSortColumn).Text.CompareTo(ItemY.SubItems(mSortColumn).Text)
End If
If mSortOrder = SortOrder.Descending
Then
Result = -Result
End If
Return
Result
End Function
End Class
Public Class ListViewNumericSort
Implements IComparer
Private
mSortColumn As Integer
Private
mSortOrder As SortOrder
Public Sub New(ByVal sortColumn As Integer, ByVal
sortOrder As SortOrder)
mSortColumn = sortColumn
mSortOrder = sortOrder
End Sub
Public Function Compare(ByVal
x As Object, ByVal y As Object) As Integer Implements
System.Collections.IComparer.Compare
Dim
Result As Integer
Dim
ItemX As ListViewItem
Dim
ItemY As ListViewItem
ItemX = CType(x,
ListViewItem)
ItemY = CType(y,
ListViewItem)
If
mSortColumn = 0 Then
Result = Decimal.Compare(CType(ItemX.Text, Decimal),
CType(ItemY.Text, Decimal))
Else
Result = Decimal.Compare(CType(ItemX.SubItems(mSortColumn).Text, Decimal), CType(ItemY.SubItems(mSortColumn).Text,
Decimal))
End If
If
mSortOrder = SortOrder.Descending Then
Result = -Result
End If
Return
Result
End Function
End Class
Public Class ListViewDateSort
Implements IComparer
Private
mSortColumn As Integer
Private
mSortOrder As SortOrder
Public Sub New(ByVal sortColumn As Integer, ByVal
sortOrder As SortOrder)
mSortColumn = sortColumn
mSortOrder = sortOrder
End Sub
Public Function Compare(ByVal
x As Object, ByVal y As Object) As Integer Implements
System.Collections.IComparer.Compare
Dim
Result As Integer
Dim
ItemX As ListViewItem
Dim
ItemY As ListViewItem
ItemX = CType(x,
ListViewItem)
ItemY = CType(y,
ListViewItem)
If
mSortColumn = 0 Then
Result = DateTime.Compare(CType(ItemX.Text, DateTime),
CType(ItemY.Text, DateTime))
Else
Result = DateTime.Compare(CType(ItemX.SubItems(mSortColumn).Text, DateTime), CType(ItemY.SubItems(mSortColumn).Text,
DateTime))
End If
If
mSortOrder = SortOrder.Descending Then
Result = -Result
End If
Return
Result
End Function
End Class
Class oluşturulduktan sonra aşağıdaki fonksiyonu ilgili formunuzun içine alınız.
Friend Sub SortMyListView(ByVal
ListViewToSort As ListView,
ByVal ColumnNumber As
Integer, Optional
ByVal Resort As
Boolean = False,
Optional ByVal
ForceSort As Boolean
= False)
' Sorts a list
view column by string, number, or date.
The three types of sorts must be specified within the listview columns
"tag" property unless the ForceSort option is enabled.
' ListViewToSort -
The listview to sort
' ColumnNumber -
The column number to sort by
' Resort - Resorts
a listview in the same direction as the last sort
' ForceSort -
Forces a sort even if no listview tag data exists and assumes a string
sort. If this is false (default) and no
tag is specified the procedure will exit
Dim
SortOrder As SortOrder
Static
LastSortColumn As Integer
= -1
Static
LastSortOrder As SortOrder
= SortOrder.Ascending
If
Resort = True Then
SortOrder = LastSortOrder
Else
If
LastSortColumn = ColumnNumber Then
If
LastSortOrder = SortOrder.Ascending Then
SortOrder =
SortOrder.Descending
Else
SortOrder =
SortOrder.Ascending
End
If
Else
SortOrder = SortOrder.Ascending
End
If
End If
If String.IsNullOrEmpty(CStr(ListViewToSort.Columns(ColumnNumber).Tag))
Then
If
ForceSort = True Then
ListViewToSort.Columns(ColumnNumber).Tag = "String"
Else
Exit
Sub ' don't sort since no tag was specified.
End
If
End If
Select Case
ListViewToSort.Columns(ColumnNumber).Tag.ToString
Case
"Numeric"
ListViewToSort.ListViewItemSorter = New ListViewNumericSort(ColumnNumber, SortOrder)
Case
"Date"
ListViewToSort.ListViewItemSorter = New ListViewDateSort(ColumnNumber, SortOrder)
Case
"String"
ListViewToSort.ListViewItemSorter = New ListViewStringSort(ColumnNumber, SortOrder)
End Select
LastSortColumn = ColumnNumber
LastSortOrder = SortOrder
ListViewToSort.ListViewItemSorter = Nothing
End Sub
Programcının yazdığı açıklamalardan da anlaşılacağı gibi, listview itemlerinin tutulduğu Column ların her birinin "tag" larını veri türüne uygun şekilde doldurmanız gerekiyor. Tarih için "Date", sayı için "Numeric" ve metin için "String" yazmalısınız. Büyük/Küçük harf önemlidir, birebir yazınız.
Son olarak aşağıdaki gibi basitçe fonksiyonu çağırıyoruz.
Private Sub liste_ColumnClick(sender As
Object, e As
System.Windows.Forms.ColumnClickEventArgs) Handles liste.ColumnClick
SortMyListView(liste, e.Column, True, True)
End Sub
e.Column yerine sadece bir rakam vererek istediğiniz olaydan sonra sort işini yaptırabilirsiniz.
Yorum ve puan verirseniz sevinirim. İyi çalışmalar.
Kaynak: http://www.vbdotnetforums.com / Sprint
Yorumlar
Yorum Gönder
Her türlü eleştiri, görüş, öneri, soru ve açıklamanızı yazmaktan çekinmeyin. (You might write in English, too)