Automatich sort listview

Status
Niet open voor verdere reacties.

bonnowagt

Gebruiker
Lid geworden
7 dec 2006
Berichten
445
Ik heb een listview mewt bijv. de volgende gegevens


Aantal Verpakking Naam:

9 1 smit
12 3
8 2

Als ik deze sorteer op de normale wijze met ascending enz. dan krijg ik nummeriek niet de juiste volgorde.
Ik heb dit opgelost door op de lisviewcolom te klikken.

Code:
 Private Sub ListView1_ColumnClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
        Dim new_sorting_column As ColumnHeader = _
       ListView1.Columns(e.Column)
        Dim sort_order As System.Windows.Forms.SortOrder
        If m_SortingColumn Is Nothing Then
            sort_order = SortOrder.Ascending
        Else
            If new_sorting_column.Equals(m_SortingColumn) Then
                If m_SortingColumn.Text.StartsWith("> ") Then
                    sort_order = SortOrder.Descending
                Else
                    sort_order = SortOrder.Ascending
                End If
            Else
                sort_order = SortOrder.Ascending
            End If
            m_SortingColumn.Text = _
                m_SortingColumn.Text.Substring(2)
        End If
        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
        ListView1.ListViewItemSorter = New  _
            listviewcomparer(e.Column, sort_order)
        ListView1.Sort()
    End Sub

en de class

Code:
Public Class listviewcomparer
    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


Dit werkt prima, maar het volgende zou ik graag willen.

Deze code in de loadevent zetten, zodat als ik de lijst opstart deze al automatich wordt gesorteerd (aflopend)
Eventueel deze aan een button hangen zou ook kunnen, wie kan mij hier mee helpen
 
Je code in een aparte sub zetten en die dan de hele tijd aanroepen?

of begrijp ik je nu verkeerd?

MartinJM
 
Nee je begrijpt mij wel goed, maar ik krijg dan de fouten zoals

ListView1.Columns(e.Column) dat werkt niet
 
Ach zo,

Je kan een string meegeven aan je sub waarin je aangeeft welke kolom die moet hebben.
Bij de click-event van de listview kan je dan de goede string meegeven aan de string, en vanuit een button kan je dan ook een string meegeven waarmee je ervoor zorgt dat er gesorteerd word op de goede kolom...

Ik hoop dat dit een beetje duidelijk is...:o


MartinJM
 
Ik heb de code van
Private Sub ListView1_ColumnClick enz..

geplaatst in de loadevent.
uiteraard krijg ik een foutmelding bij:

ListView1.Columns(e.Column)
en;
listviewcomparer(e.Column, sort_order)

beide keren dus de foutmelding betreffende e.Columm, foutmelding is. colom is not a member of System EventsArgs



Ook zou ik natuurlijk geholpen zijn als als de
Private Sub ListView1_ColumnClick enz..
automatisch kon worden ingeschakend net zo als op de manier bij een button middels button.perfomclick alleen deze code werkt hier niet bij
 
Ik zat te denken aan zoiets:

Code:
    Private Sub ListView1_ColumnClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
        ListviewSort(e.Column.ToString, SortOrder.Ascending)
    End Sub

    Private Sub ListviewSort(ByVal colom As String, ByVal sortorder As System.Windows.Forms.SortOrder)
        Dim ColomIndex As Integer = ListView1.Columns(colom).Index
        Dim sort_order As System.Windows.Forms.SortOrder = sortorder
        ListView1.ListViewItemSorter = New listviewcomparer(ColomIndex, sort_order)
        ListView1.Sort()
    End Sub

Ik heb er wel iets van jouw code uit gehaald zodat het voor mij makkelijker was te begrijpen....


Succes!:thumb:
 
[cpp]ListView1_ColumnClick(ListView1, New ColumnClickEventArgs(x))[/cpp]

Met x = de index van de column die je wilt sorteren.
 
Het probleem is niet dat de code van ,mij niet werkte dat ging prima, alleen ik moest wel op de listviewcolom klikken en dat moe tik bij ouw code nog steeds
 
Geweldig een zeer eenvoduige maar uper oplossing JOZI . Als je de code 1x plaatst is het oplopend, daar ik het aflopend moet hebben heb ik dit nog een keer geplaatst en zie het werkt. Bedankt
 
OK :P

Graag gedaan, zet je de vraag ook nog even op opgelost?
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan