VB 2015 Sortierung in Listbox

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    VB 2015 Sortierung in Listbox

    Hallo Foristi,

    ich habe neulich festgestellt, dass die automatische Sortierung in einer Listbox anders sortiert, als Microsoft Excel (2010) die gleichen Werte (Strings) sortiert.
    Gibt es da irgendwo eine Option / Justiermöglichkeit bei den Listboxen, so dass nach einer Sortierung der gleichen Werte beide Ergebnisse in der Listbox und in Excel identisch sind?
    @Dan_one Wie unterscheiden die sich?
    Ansonsten schreibst Du Deinen eigenen Sorter. Hier mal ne Vorlage:

    VB.NET-Quellcode

    1. Imports System.IO
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim diAll = New List(Of DirectoryInfo)
    5. diAll.AddRange(New DirectoryInfo("D:\User\Videos").GetDirectories())
    6. diAll.AddRange(New DirectoryInfo("C:\Temp\Videos").GetDirectories())
    7. diAll.Sort(New MySorter)
    8. Me.ListBox1.DataSource = diAll
    9. End Sub
    10. End Class
    11. Public Class MySorter
    12. Implements IComparer(Of DirectoryInfo)
    13. Public Function Compare(x As DirectoryInfo, y As DirectoryInfo) As Integer Implements IComparer(Of DirectoryInfo).Compare
    14. Dim p1 = x.Name
    15. Dim p2 = y.Name
    16. Return p1.CompareTo(p2)
    17. End Function
    18. 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!
    Also, wenn ich die Namen in einer Excel-Tabelle sortieren lasse, bekomme ich folgende Sortierung:

    Anke A.
    Anna D.
    Anna L.
    Anna W.
    Anna-Maria K.
    Anneliese K.
    Anne-Maria N.

    In der Listbox (sorted=true) erhalte ich jedoch folgende Sortierung:

    Anke A.
    Anna-Maria K.
    Anna D.
    Anna L.
    Anna W.
    Anne-Maria N.
    Anneliese K.

    Da werden in der Listbox die Namen mit Bindestrich also vorgezogen und ich weiß nicht, warum.
    @Dan_one Ich merke gerade, dass die von mir gepostete Methode so nicht funktioniert, da ListBox.Sort(Sorter) protected ist.
    Du müsstest eine eigene ListBox-Klasse implementieren, dann kannst Du sortieren wie immer Du willst:
    Dies als Anhaltspunkt: stackoverflow.com/questions/3012647/custom-listbox-sorting
    Es gibt sicher auch VB-Beispiele oder Du konvertierst den Code.
    ====
    Sorry, ich hab ja die List(Of DirectoryInfo) sortiert, nicht das ListView.
    Probier dies:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim lines = System.IO.File.ReadAllLines("c:\temp\Sort.txt").ToList()
    4. lines.Sort(New MySorter)
    5. Me.ListBox1.Items.AddRange(lines.ToArray())
    6. End Sub
    7. End Class
    8. Public Class MySorter
    9. Implements IComparer(Of String)
    10. Public Function Compare(x As String, y As String) As Integer Implements IComparer(Of String).Compare
    11. Return x.CompareTo(y)
    12. End Function
    13. 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!

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

    @Dan_one

    Der Vorschlag von RFG ist natürlich die professionelle Variante, auch für extrem grosse Listen.
    Sofern du auf den IComparer verzichten kannst/möchtest, gäbe es noch diese Möglichkeit.
    Die Sortierung erfolgt in Zeile 8 also in einer Zeile

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Class Form1
    4. Private Rand As New Random
    5. Private Lst As List(Of String)
    6. Private Sub BtSort_Click(sender As Object, e As EventArgs) Handles BtSort.Click
    7. Me.ListBox1.DataSource = Nothing
    8. Me.ListBox1.DataSource = Me.Lst.OrderBy(Function(s) s).ToList
    9. End Sub
    10. Private Sub InitializeListBox()
    11. Me.lst = New List(Of String) From {
    12. "Anke A.", "Anna D.",
    13. "Anna L.", "Anna W.",
    14. "Anna-Maria K.", "Anneliese K.",
    15. "Anne - Maria N."
    16. }
    17. Me.Lst = Me.Lst.OrderBy(Function(s) Me.Rand.Next).ToList
    18. Me.ListBox1.DataSource = Me.lst
    19. End Sub
    20. Public Sub New()
    21. MyBase.New
    22. Me.InitializeComponent()
    23. Me.InitializeListBox()
    24. End Sub
    25. End Class


    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „exc-jdbi“ ()

    Danke euch erst mal bis hier her für eure Bemühungen!

    Meine Frage bleibt aber: Warum sortiert eine Listbox in Microsoft Visual Basic (2015) anders als eine Tabelle in Microsoft Excel (2010) und kann man das irgendwo unter "Optionen" oder "Einstellungen" angleichen?

    Es muss ja an den alphnumerischen Zeichenketten selbst liegen, denn wenn ich die Elemente der Listbox 1 zu 1 in eine Textdatei schreibe, diesen Text dann mit C&P in die Tabelle einfüge und Excel sortieren lasse, ändert sich die Reihenfolge. Das verwirrt mich.
    Die Problematik hast Du auch schon innerhalb von Excel. Nimmt man die Excel-Wert-Sortierung und die Standard-String-Sortierung mit diesem Makro aus dem MSDN.

    Visual Basic-Quellcode

    1. With Me.ListBox1
    2. For j = 0 To ListBox1.ListCount - 2
    3. For i = 0 To ListBox1.ListCount - 2
    4. If .List(i) > .List(i + 1) Then
    5. temp = .List(i)
    6. .List(i) = .List(i + 1)
    7. .List(i + 1) = temp
    8. End If
    9. Next i
    10. Next j
    11. End With

    Dann kommt auch schon ne andere Reihenfolge raus:


    links Excel-Sortierung, rechts VBA-ListBox
    Man beachte die Unterschiede zwischen Leerzeichen und Bindestrich zum einen, aber auch Groß-/Kleinschreibung - obwohl das hier nicht relevant ist. Da wird der Sortieralgorithmus wohl einfach anders bzw. mit anderer Prioritätenverteilung implementiert sein.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich hab jetzt auch schon länger nicht mehr VBA programmiert, aber soviel ich mich noch erinnern kan gibt es auch dort eine ASC()-Funktion.

    Wenn man in Zeile 4 folgendes schreibt, könnte ich mir vorstellen, dass es etwa gleich aussehen sollte wie in Vb.net

    VB.NET-Quellcode

    1. If asc( .List(i)) > asc(.List(i + 1))


    EDIT: Ach Sorry. VBA macht es glaube schon so wie VB.NET, das Space ist auf dem Bild zuoberst. Habe gedacht es sei zu unters.

    Wäre sicher ein versuch wert.

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „exc-jdbi“ ()

    Das Ergebnis ist das Gleiche, da sich die Makrosortierung ja so verhält wie die Sortierung in VB.Net: ASCII-Zeichenreihenfolge eben. Nur eben die "normale" Textsortierung in Excel verhält sich anders.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Bei Mikrosaft habe ich einen Sortierproblemthread gefunden, wo geklärt wird, was mich bei der Sortierung verwirrt hat. Bindestriche werden fast immer ignoriert.

    joeu2004 schrieb:

    Apostrophes (') and hyphens (-) are ignored, with one exception: If two text strings are the same except for a hyphen, the text with the hyphen is sorted last.

    Daher kommt bei der Excelsortierung Anne-Liese vor Annemarie, aber Anna-Lena nach Annabella. In der VB.Net-ListBox wird auch der Bindestrich normal in die Sortierung einbezogen.

    ##########

    @exc-jdbi: Aber die Strich-Leerzeichen-Punkt-Unterstrich-Buchstaben-Reihenfolge hatten wir doch schon mit der normalen Excelsortierung, siehe Post#7.
    Wir suchen ja eigentlich noch eine Lösung für die Namensortierung aus Post#3. Aber es stellt sich auch die Frage, was davon überhaupt sortiert werden darf: Darf die Excelreihenfolge geändert werden oder muss die VB.Net-Reihenfolge auf Excel abgestimmt werden? Dass muss @Dan_one festlegen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „VaporiZed“ ()