Checklistbox sortiert nicht richtig

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

Es gibt 29 Antworten in diesem Thema. Der letzte Beitrag () ist von VB1963.

    Checklistbox sortiert nicht richtig

    Hallo Leute,

    ich habe in einem Datagriedview mehrere Einträge und will diese in eine Checklistbox übergeben lassen.

    In der Tabelle stehen z.b. solche Einträge:
    6.1.10
    6.1.20
    6.1.30
    6.1.40
    6.1.10
    6.1.20
    6.1.30
    6.1.40
    4.6.10
    4.6.40
    14.2.10
    14.2.20

    Übergeben werden die Einträge wie folgt:

    VB.NET-Quellcode

    1. Form2.CheckedListBox1.Sorted=True
    2. For i As Integer = 0 To Me.DataGridView1.Rows.Count - 1
    3. Dim var_Position As String = Me.DataGridView1.Item(1, i).Value
    4. If var_Position = Nothing Then
    5. Continue For
    6. End If
    7. If Form2.CheckedListBox1.Items.Count = 0 Then
    8. Form2.CheckedListBox1.Items.Add(var_Position)
    9. End If
    10. Dim positionvorhanden As String = "nein"
    11. For i2 As Integer = 0 To Form2.CheckedListBox1.Items.Count - 1
    12. If Form2.CheckedListBox1.Items(i2).ToString = var_Position Then
    13. positionvorhanden = "ja"
    14. Exit For
    15. End If
    16. Next
    17. If positionvorhanden = "nein" Then
    18. Form2.CheckedListBox1.Items.Add(var_Position)
    19. Form2.CheckedListBox1.Items.Add(var_Position)
    20. End If
    21. Next


    In der Checklistbox habe ich die Sort-Eige

    Das Ergebniss sieht aber leider so aus:

    14.2.20
    4.6.10
    4.6.40
    6.1.10
    etc..

    Was mache ich falsch
    Schaue einmal hier hinein, da wird die Sortmethode in einer abgeleiteten Klasse überschrieben. Dort kannst du deinen eigen Algo einfügen...
    Oder versuche es einmal so:

    VB.NET-Quellcode

    1. DeineCheckedListbox.Sort(AddressOf compareStringNummeric)
    2. Private Function compareStringNummeric(x As String, y As String) As Integer
    3. Dim i, j As Integer
    4. If String.IsNullOrEmpty(x) Then x = "0"c
    5. If String.IsNullOrEmpty(y) Then y = "0"c
    6. If Integer.TryParse(x.Replace("."c,""), i) AndAlso Integer.TryParse(y.Replace("."c,""), j) Then Return i.CompareTo(j)
    7. Throw New System.ArgumentException(String.Concat("ungültiges Vergleichsargument! ", x, " - ", y))
    8. End Function
    ist aber ungetestet!

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

    Cool Klappt in deinem Programm Richtig gut

    Kleines Problem. Du sortierst ja nicht die Listbox sondern die mylist.

    Wie bekomme ich jetzt die Einträge da rein.

    Ich habe es so versucht, klappt aber nicht

    VB.NET-Quellcode

    1. for i as integer = 0 to Form2.Listbox1.items.count -1
    2. mylist=mylist & "," & Form2.listbox1.items(i).tostring
    3. next
    Schau dir bei der List(Of T)-Klasse einmal die Add-Methode genau an...
    Du bindest die Datasource der Listbox einfach an die List(Of String).
    Diese Liste ist dein Datenhalter und mit der bearbeitest du deine Daten.
    Das hat mit der Items-Auflistung der Listbox nichts mehr zu tun...
    Du hast mich fast ans Ziel geführt:

    VB.NET-Quellcode

    1. Dim myList As New List(Of String) From {}
    2. For i3 As Integer = 0 To Me.CheckedListBox1.Items.Count - 1
    3. myList.Add(Me.CheckedListBox1.Items(i3).ToString)
    4. Next
    5. Me.CheckedListBox1.DataSource = Nothing
    6. myList.Sort(AddressOf compareStringNummeric)
    7. Me.CheckedListBox1.DataSource = myList


    Ich versteh beim besten willen deinen Code zum Sortieren nicht.

    Aber danke ersteinmal. Mit Zweistelligen Zhalen vorn (z.B. 14.xx.xx) gibt es noch Probleme aber ich komm schon dahinter.

    Sonst melde ich mich wieder

    VB1963 schrieb:

    Das hat mit der Items-Auflistung der Listbox nichts mehr zu tun...
    d.h. Zeile #2 bis #4 brauchst du nicht. Lasse die Items-Auflistung deiner CheckedListbox einfach leer!
    Wie kommen deine Items überhaupt in die ItemsAuflistung der CheckedListbox1? Hast du sie per Designer gefüllt?
    Du must nur die myList mit Add befüllen...

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

    So funktioniert es fast, jedoch nicht sobald die erste beiden Zahlen zweistellig werden:

    Visual Basic-Quellcode

    1. For i As Integer = 0 To Me.DataGridView1.Rows.Count - 1
    2. Dim var_Position As String = Me.DataGridView1.Item(1, i).Value
    3. If var_Position = Nothing Then
    4. Continue For
    5. End If
    6. If Form2.CheckedListBox1.Items.Count = 0 Then
    7. Form2.CheckedListBox1.Items.Add(var_Position)
    8. Continue For
    9. End If
    10. Dim positionvorhanden As String = "nein"
    11. For i2 As Integer = 0 To Form2.CheckedListBox1.Items.Count - 1
    12. If Form2.CheckedListBox1.Items(i2).ToString = var_Position Then
    13. positionvorhanden = "ja"
    14. Exit For
    15. End If
    16. Next
    17. If positionvorhanden = "nein" Then
    18. Dim prüfposition As String
    19. Dim prüfposition2 As String
    20. Dim neueposition As String
    21. For i3 As Integer = 0 To Form2.CheckedListBox1.Items.Count - 1
    22. prüfposition = Form2.CheckedListBox1.Items(i3).ToString
    23. prüfposition = prüfposition.Replace(".", "")
    24. neueposition = var_Position.Replace(".", "")
    25. 'MsgBox(prüfposition & vbNewLine & prüfposition2 & vbNewLine & neueposition)
    26. If i3 < Form2.CheckedListBox1.Items.Count - 1 Then
    27. prüfposition2 = Form2.CheckedListBox1.Items(i3 + 1).ToString
    28. prüfposition2 = prüfposition.Replace(".", "")
    29. Else
    30. Form2.CheckedListBox1.Items.Add(var_Position)
    31. Exit For
    32. End If
    33. If CDbl(neueposition) > CDbl(prüfposition) Then
    34. Continue For
    35. End If
    36. If CDbl(neueposition) < CDbl(prüfposition2) Then
    37. Form2.CheckedListBox1.Items.Insert(i3, var_Position)
    38. Exit For
    39. End If
    40. Next
    41. End If
    42. Next
    43. End Sub


    Edit: IST KLAR: IRGENWIE IST DER KOPF AUS.... 4.5.120 (45120) ist natürlich größer als 6.1.10 (6110)

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

    Sisco schrieb:

    Form2.CheckedListBox1
    liegt die Listbox in einer anderen Form?
    Hast du Option Strict On eingestellt?
    Dim positionvorhanden As String = "nein" ... da mache ein Boolean daraus und prüfe auf True/False
    Keine Ahnung, was du da mit den Prüfpositionen vor hast?
    Das DGV bekommt die Daten von wo her?
    Wie sieht dein Datenmodell aus?
    Tut mir leid - da sind noch sehr viele fragen offen, die müssen abgeklärt werden...

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

    Und wo ist Dein Objekt von Form2?
    Dialoge: Instanziierung von Forms und Aufruf von Dialogen

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Und wo ist jetzt meine Frage beantwortet?
    Du rufst schließlich Controls einer anderen Form über eine Klasse ab, das ist ein doppelter Verstoß gegen die OOP. Gut, in dem Fall haste eine Standardinstanz, aber dennoch, nach außerhin ist es schon falsch und führt nur zu Problemen.
    1. Brauchst Du eine Instanz. Eine Form ist nichts anderes als eine Klasse.
    2. Sollten Controls privat sein und nur von der entsprechenden Klasse Deiner Form verwaltet werden. Zugriff von außen ist nicht OO-konform, denn sind nur die Member Deiner Form.
    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    @Sisco
    Im Groben und Ganzen brauchst du nur folgendes machen:

    VB.NET-Quellcode

    1. Dim myList as New List(Of String)
    2. For i = 0 To Me.DataGridView1.Rows.Count - 1
    3. Dim var_Position = CStr(Me.DataGridView1.Item(1, i).Value)
    4. If String.IsNullOrEmpty(var_Position) OrElse myList.Contains(var_Position) Then Continue For
    5. myList.Add(var_Position)
    6. Next
    7. myList.Sort(AddressOf compareStringNummeric)
    8. Me.CheckedListBox1.DataSource = myList
    Das mit der Instanz von Form2 must du noch bereinigen...
    Weitere Möglichkeiten, die sich zu 99% auftun werden:
    Du wurstelst mit dem DGV als Datenhalter herum, das ist nicht die feine Art...
    Keine Ahnung von woher deine 45 A4-Seiten eingelesen werden...
    Wenn es eine DB ist, versuche die Daten in ein typ. Dataset einzulesen und das DGV bindest du dann an die typ. Datatable.
    Die Daten für deine CheckedListbox holst du dir dann mit einer geeigneten LINQ-Abfrage auch aus der typ. Datatable und hängst sie an die CheckedListbox.Datasource-Eigenschaft...
    IST KLAR: IRGENWIE IST DER KOPF AUS.... 4.5.120 (45120) ist natürlich größer als 6.1.10 (6110)
    Wie soll jetzt wirklich sortiert werden, das muss genau definiert werden...

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