Hej! Kan detta funka tro: Nja, det var inte riktigt så jag menade. Vad jag vill det är att användaren skall kunna välja om det skall sorteras efter förnamn eller efternamn. om datat kommer från en DataTable så kan du sortera den först. Jag valde att sortera datan i SQL-satsen istället för i listviewen. I Vb 6 hade det varit enklare att sortera i listviewen. Du har möjligheten att soretera en listview hur du vill genom att bara skapa en class som implementerar ICompare gränssnittet: Har letat efter en sån här funktion. Funkar bra förutom att den sorterar tal fel. 9 kommer t.ex. efter 10. Hur löser jag det? Att den sorterar 9 efter 10 är knappast fel (9 är större än 1), men kanske inte önskvärt. Det är ju dock lätt att lösa genom att göra om det till integer och jämföra storlek i sin comparer. Jag har använt denna funktionen för att kunna sortera tal också. Jag använder C#, så jag har bara kört funktionen genom en online-översättare. Hoppas att det fungerar:Sortering i listview
Hur sorterar man en listview efter en column? T.ex. I en listview med två kolumner (förnamn, efternamn) skall användaren kunna välja om det skall sorteras efter förnamn eller efternamn.
Jag har hittat lösningar till VB 6 men får det inte att fungera i .NET.
/GetSv: Sortering i listview
<code>listView1.Sorting = SortOrder.Ascending;</code>
//FreddeSv: Sortering i listview
/GetSv: Sortering i listview
MyDataTable.DefaultView.Sort="stad asc"
MyListview.datasource=MyDataTable;Sv: Sortering i listview
Tack till alla som visat intresse för mitt problem!
/GetSv: Sortering i listview
<code>
Public Class ListViewSort
Implements System.Collections.IComparer
Private mSorting As System.Windows.Forms.SortOrder
Private mColumnIndex As Integer
Private mCompareMethod As Microsoft.VisualBasic.CompareMethod
Public Property Sorting() As System.Windows.Forms.SortOrder
Get
Return mSorting
End Get
Set(ByVal Value As System.Windows.Forms.SortOrder)
mSorting = Value
End Set
End Property
Public Property ColumnIndex() As Integer
Get
Return mColumnIndex
End Get
Set(ByVal Value As Integer)
mColumnIndex = Value
End Set
End Property
Public Property CompareMethod() As Microsoft.VisualBasic.CompareMethod
Get
Return mCompareMethod
End Get
Set(ByVal Value As Microsoft.VisualBasic.CompareMethod)
mCompareMethod = Value
End Set
End Property
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
Dim ItemX As ListViewItem
Dim ItemY As ListViewItem
Select Case mSorting
Case SortOrder.None
Case SortOrder.Ascending
ItemX = x
ItemY = y
Compare = StrComp(ItemX.SubItems(mColumnIndex).Text, ItemY.SubItems(mColumnIndex).Text, mCompareMethod)
Case SortOrder.Descending
ItemX = x
ItemY = y
Compare = -StrComp(ItemX.SubItems(mColumnIndex).Text, ItemY.SubItems(mColumnIndex).Text, mCompareMethod)
End Select
End Function
Public Sub New(ByVal Sorting As System.Windows.Forms.SortOrder)
mSorting = Sorting
End Sub
Public Sub New(ByVal Sorting As System.Windows.Forms.SortOrder, ByVal CompareMethod As Microsoft.VisualBasic.CompareMethod)
mSorting = Sorting
mCompareMethod = CompareMethod
End Sub
End Class
</code>
Sedan skapar du bara en instans som du anropar i ColumnClick eventet:
<code>
Private mListViewSort As ListViewSort
Private Sub ListView1_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
If mListViewSort.ColumnIndex = e.Column Then
If mListViewSort.Sorting = SortOrder.Ascending Then
mListViewSort.Sorting = SortOrder.Descending
Else
mListViewSort.Sorting = SortOrder.Ascending
End If
ListView1.Sort()
Else
mListViewSort.ColumnIndex = e.Column
mListViewSort.Sorting = SortOrder.Ascending
ListView1.Sort()
End If
End Sub
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load
mListViewSort = New ListViewSort(SortOrder.None, CompareMethod.Text)
ListView1.ListViewItemSorter() = mListViewSort
'Exempel data
Dim Values() As ListViewItem
ReDim Values(4)
Values(0) = New ListViewItem(Split("Nils Petterson"))
Values(1) = New ListViewItem(Split("Adam Östman"))
Values(2) = New ListViewItem(Split("Bengt Carlsson"))
Values(3) = New ListViewItem(Split("Carl Bengtsson"))
Values(4) = New ListViewItem(Split("Peter Olsson"))
ListView1.Items.AddRange(Values)
End Sub
End Class
</code>Sv:Sortering i listview
Tack på förhand
/PärSv: Sortering i listview
Sv: Sortering i listview
<code>
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer
Dim ReturnVal As Integer
Dim d1 As Double,d2 As Double
If Double.TryParse((CType(x,ListViewItem)).SubItems(col).Text,System.Globalization.NumberStyles.Any,Nothing,out d1 Then
Double.TryParse((CType(y, ListViewItem)).SubItems(col).Text, System.Globalization.NumberStyles.Any, Nothing, d2))
ReturnVal = Decimal.Compare(Convert.ToDecimal(d1), Convert.ToDecimal(d2))
Else
ReturnVal = String.Compare((CType(x, ListViewItem)).SubItems(col).Text, ((ListViewItem)y).SubItems(col).Text)
End If
If order = SortOrder.Descending Then
' Invert the value returned by String.Compare.
ReturnVal * = -1
End If
Return ReturnVal
End Function
</code>
/Johan