ListView sortierung

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von Remi Lay.

    ListView sortierung

    Hallo Zusammen



    Ich habe eine Listview erstellt und ich würde gerne die Zahlen nach der grössen nach anzeigen lassen.

    Ich habe als Einstellung für die ListView (Sorting - Descending) gewählt aber ich erhlate die Zahlen nicht nach grösse nach sortiert (siehe Bild)

    Könnt Ihr mir villeicht einen Tipp geben wie ich das erledigen kann.

    Freundliche Grüsse Remi Lay
    Bilder
    • ansicht.png

      5,77 kB, 141×450, 568 mal angesehen
    Momentan wird die Text-Darstellung Deiner Zahlen aplhabetisch sortiert. :D
    Du musst Deinem ListView beibringen, diese beim Sortieren als Zahlen aufzufassen.
    Such mal auf der Startseite nach ListViewSorter.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für die schnelle Antwort.

    Ich glaube es wird ein bisschen komplizierter, denn mein jetziger Code sieht so aus :

    VB.NET-Quellcode

    1. Dim content As String() = System.IO.File.ReadAllLines("C:\Data\Auswertung_Strecke.txt") ' Erstellt ein Array "content" vom Typ String und füllt es mit den Zeilen
    2. For Each line As String In content ' Die foreach Schleife geht jede Zeile in dem Array content durch
    3. Dim startnummer As String = line.Split("_")(0) 'Hier wird eine Variable "startnummer" vom Typ String erstellt und mit mit dem Wert des 1. Spliteintrags gefüllt. (line.Split("_") gibt ein Array zurück und mit dem (0) lese ich den ersten Eintrag direkt aus dem Array
    4. Dim punkte As String = line.Split("_")(1).Replace(";", "") ' Hier wird das gleiche wie oben gemacht, nur das der 2. Eintrag des line.Split("_") Arrays ausgelesen wird und zusätzlich das Zeichen ";" mit "" (nichts) ersetzt wird.
    5. 'Hier wird die Variable "startnummer" zu einem Integer konvertiert und abgefragt ob es 2 ist. Ohne CIn geht das so: If startnummer = "2" Then
    6. ListView7.Items.Add(punkte).SubItems.Add(startnummer) 'Hier geb ich eine MessageBox mit einem Formatierten String aus, die Zeichenfolgen: {0} und {1} sind Platzhalter für die darauf folgenden Variablen startnummer und punkte.
    7. Next
    8. Else
    9. MsgBox("Keine Daten verfügbar. Bitte erstellen Sie eine Startnummer")
    10. End If


    Ich habe die Funktion ListViewSorter im Web nachgegoogelt und jetzt versuche ich es ein bisschen aus.



    Freundliche Grüsse Rémi Lay
    Für DataGridView ist mir zu umständlich jetzt noch alles umzuwechseln aber beim nächsten Programm werde ich besser mit DataGridView arbeiten.

    Ich habe im google nachgeschaut über Numerische Sortierung der ListView aber es viel zu kompliziert. Kann mir jemmand es genau erklären oder einen leicht verständlicher Code geben xD.



    Danke für eine rasche Antwort.



    Freundliche Grüsse Rémi Lay

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Remi Lay“ ()

    Du hast da wohl etwas zu viel abgeschrieben.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich habe hier ein Bild was er als Fehler markiert.

    Könnt ihr villeicht ein beispiel machen ? ich suche schon den ganzen morgen nach einer Lösung aber ich habe keine erfolgreiche lösung gefunden.

    Freundliche Grüsse Rémi Lay
    Bilder
    • fehler1.png

      51,11 kB, 539×591, 540 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Remi Lay“ ()

    Wo muss ich das hier kopieren damit es funktioniert ? In Private Sub xXX_Load geht es nicht.

    VB.NET-Quellcode

    1. Public Class ListViewComparer Implements IComparer Private col As Integer Private order As SortOrder Public Sub New(ByVal col As Integer, _ ByVal order As SortOrder)
    2. Me.col = col
    3. Me.order = order End Sub Public Function Compare(ByVal x As Object, _ ByVal y As Object) As Integer _ Implements System.Collections.IComparer.Compare Dim item1, item2 As ListViewItem item1 = x item2 = y
    4. If Me.order = SortOrder.Ascending Then Return item1.SubItems(col).Text.CompareTo( _ item2.SubItems(col).Text)
    5. Else Return item2.SubItems(col).Text.CompareTo( _ item1.SubItems(col).Text)
    6. End If
    7. End Function
    8. End Class




    Das Kopieren ich bei einem Button wo ich die Treevies anzeige lasse

    VB.NET-Quellcode

    1. If ListView7.Sorting = SortOrder.Ascending Then
    2. ListView7.Sorting = SortOrder.Descending
    3. ListView7.ListViewItemSorter = _
    4. New ListViewComparer(e.Column, SortOrder.Descending)
    5. Else
    6. ListView7.Sorting = SortOrder.Ascending
    7. ListView7.ListViewItemSorter = _
    8. New ListViewComparer(e.Column, SortOrder.Ascending)
    9. End If


    Freundliche Grüsse Rémi Lay

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Remi Lay“ ()

    Sieh Dir mal das an:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. ' configure Listview
    4. ListView1.View = View.Details
    5. ListView1.Columns.Add(New ColumnHeader())
    6. Me.ListView1.Columns(0).Text = "Column 0"
    7. ListView1.Columns.Add(New ColumnHeader())
    8. Me.ListView1.Columns(1).Text = "Column 1"
    9. ListView1.Columns.Add(New ColumnHeader())
    10. Me.ListView1.Columns(2).Text = "Column 2"
    11. ' SET SORT
    12. ListView1.Sorting = SortOrder.Ascending
    13. ' add some values
    14. ListView1.Items.Add(New ListViewItem(New String() {"9", "A", "e"}))
    15. ListView1.Items.Add(New ListViewItem(New String() {"1", "b", "D"}))
    16. ListView1.Items.Add(New ListViewItem(New String() {"-1", "C", "c"}))
    17. ListView1.Items.Add(New ListViewItem(New String() {"-5", "d", "B"}))
    18. ListView1.Items.Add(New ListViewItem(New String() {"100", "E", "a"}))
    19. End Sub
    20. Private Sub ListView1_ColumnClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
    21. Select Case e.Column
    22. Case 0
    23. Me.ListView1.ListViewItemSorter = New ListViewItemComparer123(0)
    24. Case Else
    25. Me.ListView1.ListViewItemSorter = New ListViewItemComparerABC(e.Column)
    26. End Select
    27. End Sub
    28. End Class
    29. ' LV Sorter: sorts 1.column numeric
    30. Class ListViewItemComparer123
    31. Implements IComparer
    32. Private col As Integer
    33. Public Sub New()
    34. col = 0
    35. End Sub
    36. Public Sub New(ByVal column As Integer)
    37. col = column
    38. End Sub
    39. Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
    40. Dim lviX As ListViewItem = CType(x, ListViewItem)
    41. Dim lviY As ListViewItem = CType(y, ListViewItem)
    42. ' compare number in 1. Column
    43. Return CInt(lviX.Text) - CInt(lviY.Text)
    44. End Function
    45. End Class
    46. ' Implements the manual sorting of items by columns.
    47. Class ListViewItemComparerABC
    48. Implements IComparer
    49. Private col As Integer
    50. Public Sub New()
    51. col = 0
    52. End Sub
    53. Public Sub New(ByVal column As Integer)
    54. col = column
    55. End Sub
    56. Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
    57. Implements IComparer.Compare
    58. Return [String].Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)
    59. End Function
    60. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Danke für die Antwort. Ich habe es als test so getestet und es funktioniert.
    Mein Code :

    VB.NET-Quellcode

    1. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. If Not Directory.Exists("C:\Data") Then
    3. ' Nein! Jetzt erstellen...
    4. Directory.CreateDirectory("C:\Data")
    5. End If
    6. MsgBox("Die Daten werden auf C:\Data gespeichert.")
    7. ListView1.View = View.Details
    8. ListView1.Columns.Add(New ColumnHeader())
    9. Me.ListView1.Columns(0).Text = "Startnummer"
    10. ListView1.Columns.Add(New ColumnHeader())
    11. Me.ListView1.Columns(1).Text = "Punktezahl"
    12. 'Daten einlesen
    13. If File.Exists("C:\Data\Auswertung_Punktetotal.txt") Then
    14. Dim content As String() = System.IO.File.ReadAllLines("C:\Data\Auswertung_Punktetotal.txt") ' Erstellt ein Array "content" vom Typ String und füllt es mit den Zeilen
    15. For Each line As String In content ' Die foreach Schleife geht jede Zeile in dem Array content durch
    16. Dim startnummer As String = line.Split("_")(0) 'Hier wird eine Variable "startnummer" vom Typ String erstellt und mit mit dem Wert des 1. Spliteintrags gefüllt. (line.Split("_") gibt ein Array zurück und mit dem (0) lese ich den ersten Eintrag direkt aus dem Array
    17. Dim punkte As String = line.Split("_")(1).Replace(";", "") ' Hier wird das gleiche wie oben gemacht, nur das der 2. Eintrag des line.Split("_") Arrays ausgelesen wird und zusätzlich das Zeichen ";" mit "" (nichts) ersetzt wird.
    18. 'Hier wird die Variable "startnummer" zu einem Integer konvertiert und abgefragt ob es 2 ist. Ohne CIn geht das so: If startnummer = "2" Then
    19. ListView1.Items.Add(punkte).SubItems.Add(startnummer) 'Hier geb ich eine MessageBox mit einem Formatierten String aus, die Zeichenfolgen: {0} und {1} sind Platzhalter für die darauf folgenden Variablen startnummer und punkte.
    20. Next
    21. End If
    22. ListView1.Sorting = SortOrder.Ascending
    23. End Sub
    24. Private Sub ListView1_ColumnClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
    25. Select Case e.Column
    26. Case 0
    27. Me.ListView1.ListViewItemSorter = New ListViewItemComparer123(0)
    28. Case Else
    29. Me.ListView1.ListViewItemSorter = New ListViewItemComparerABC(e.Column)
    30. End Select
    31. End Sub
    32. Class ListViewItemComparer123
    33. Implements IComparer
    34. Private col As Integer
    35. Public Sub New()
    36. col = 0
    37. End Sub
    38. Public Sub New(ByVal column As Integer)
    39. col = column
    40. End Sub
    41. Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare
    42. Dim lviX As ListViewItem = CType(x, ListViewItem)
    43. Dim lviY As ListViewItem = CType(y, ListViewItem)
    44. ' compare number in 1. Column
    45. Return CInt(lviX.Text) - CInt(lviY.Text)
    46. End Function
    47. End Class
    48. Class ListViewItemComparerABC
    49. Implements IComparer
    50. Private col As Integer
    51. Public Sub New()
    52. col = 0
    53. End Sub
    54. Public Sub New(ByVal column As Integer)
    55. col = column
    56. End Sub
    57. Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _
    58. Implements IComparer.Compare
    59. Return [String].Compare(CType(x, ListViewItem).SubItems(col).Text, CType(y, ListViewItem).SubItems(col).Text)
    60. End Function
    61. End Class


    Das Problem wo ich habe, ist das ich mit diesem Code die Spalte 1 sortiere, aber ich möchte die Spalte 2 sortieren. Wo muss ich die Funktion so umtauschen das ich die Spalte 2 sortieren kann und nicht die Spalte 1. Wenn jemand den Code noch auskommentieren könnte, wüsste ich auch was der Code machen würde aber der Ansatz ist supper.



    Habs gefunden :) Me.ListView1.ListViewItemSorter = New ListViewItemComparer123(1)



    Freundliche Grüsse Rémi Lay

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Remi Lay“ ()

    Da:

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Private Sub ListView1_ColumnClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
    2. Select Case e.Column
    3. Case 0
    4. Me.ListView1.ListViewItemSorter = New ListViewItemComparer123(0)
    5. Case Else
    6. Me.ListView1.ListViewItemSorter = New ListViewItemComparerABC(e.Column)
    7. End Select
    8. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Da:

    RodFromGermany schrieb:

    VB.NET-Quellcode

    1. Private Sub ListView1_ColumnClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick
    2. Select Case e.Column
    3. Case 0
    4. Me.ListView1.ListViewItemSorter = New ListViewItemComparer123(0)
    5. Case Else
    6. Me.ListView1.ListViewItemSorter = New ListViewItemComparerABC(e.Column)
    7. End Select
    8. End Sub




    Danke für die rasche Antwort. Du bist mir sehr Hilfreich.

    Die sortierung erfolgt nur wenn ich auf die bestimmte Spalte klicke, doch was ist wenn ich die Sortierung durch ein Button erfolgen soll.

    VB.NET-Quellcode

    1. Me.ListView1.ListViewItemSorter = New ListViewItemComparerABC(e.Column)


    VB.NET-Quellcode

    1. Private Sub ListView1_ColumnClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles ListView1.ColumnClick


    Ich rufe die Funktion mit Listview1_ColumnClick doch wenn ich ButtonClick nehme, ist ja der ColumnClickEventArgs nicht vorhanden. Gibt es da eine Lösung ?

    Und ist e.Column ein Platzhalter (e.) für die Spaltennummer ?

    Freundliche Grüsse Rémi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Remi Lay“ ()

    (Zwischen-Unk): Der ListView-Holzweg

    Als nächstes bekommst du noch eine Datum-Spalte, und dann schreibst du den dritten ListViewSorter.

    Dassis eben das Prinzip Holzweg: Jedes "Vorankommen" macht einen noch weniger geneigt, alles nochmal neu und diesmal richtig aufzuziehen.

    Remi Lay schrieb:

    Und ist e.Column ein Platzhalter (e.) für die Spaltennummer ?
    Column ist englisch und heißt auf deutsch ...
    Mach statt

    VB.NET-Quellcode

    1. Select Case e.Column
    ==>

    VB.NET-Quellcode

    1. Select Case MEINE_SPALTENNUMMER
    wobei MEINE_SPALTENNUMMER die Nummer der zu sortierenden Spalte ist.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    ErfinderDesRades schrieb:

    (Zwischen-Unk): Der ListView-Holzweg

    Als nächstes bekommst du noch eine Datum-Spalte, und dann schreibst du den dritten ListViewSorter.

    Dassis eben das Prinzip Holzweg: Jedes "Vorankommen" macht einen noch weniger geneigt, alles nochmal neu und diesmal richtig aufzuziehen.
    Danke für die Antwort. Diese Antwort hast du mir schon mal gegebenen, doch ich habe leider keine Nerven mehr und wenn ich wieder von vorne beginne, dann platz mir den Kragen völlig. Freundliche Grüsse Rémi Lay