Do While Loop / RemoveAt aus Listbox

  • VB.NET

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von MacPiet.

    Do While Loop / RemoveAt aus Listbox

    Hallo ihr Profis.

    Ich hänge an einem Punkt fest und weiß als ursprünglicher VBA in excel Nutzer gerade nicht weiter und hoffe,
    dass ihr mir den entscheidenden Hinweis geben könnt.

    ich habe im Grunde diese Ausgangslage

    Es kam jetzt eine Textbox dazu, in der ich einen Wert eintrage. Um sicher zu gehen, dass da kein Unfug passiert,
    sieht das Textfeld im Code so aus:

    VB.NET-Quellcode

    1. 'FilterBox
    2. Private Sub TBFilter_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles tbFilter.KeyPress
    3. Select Case Asc(e.KeyChar)
    4. Case 48 To 57, 8
    5. ' Zahlen, Backspace zulassen / für space -> ,32
    6. Case Else
    7. ' alle anderen Eingaben unterdrücken
    8. e.Handled = True
    9. End Select
    10. End Sub


    Jetzt soll dieser Wert die x-letzten Eingaben vorgeben,
    die in der zweiten Listbox ausgewertet werden sollen. und da hänge ich,
    denn trotz Option Strict On bekomme ich einen Fehler, wie im Screenshot zu sehen ist.

    Was ist an diesem Code denn jetzt falsch, und wie bekomm ich das richtig hin?

    VB.NET-Quellcode

    1. Private Sub BtnReload_Click(sender As Object, e As EventArgs) Handles BtnReload.Click
    2. If ListBox1.Items.Count.ToString <= tbFilter.Text Then
    3. FilterRunden = ListBox1.Items.Count
    4. Else
    5. FilterRunden = CInt(tbFilter.Text.ToString)
    6. End If
    7. Do While ListBox1.Items.Count >= FilterRunden
    8. OriginalListe.RemoveAt(OriginalListe.Count -1)
    9. Loop
    10. End Sub


    Vielen lieben Dank im Voraus
    MacPiet

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

    So etwas(löschen aus einer Auflistung) macht man immer von hinten weg...
    Du willst ein Element aus einer Liste löschen, die nicht es mehr oder nicht gibt...
    Versuche es mit:
    OriginalListe.RemoveAt(OriginalListe.Count-1)
    Grund: der Index einer Auflistung ist immer 0-basiert! ... Index des 1.Eintrags ist 0 usw...
    Frage: hat die OriginalListe überhaupt Einträge?

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

    Wie stehen denn ListBox1 und Originalliste im Zusammenhang, in Form von DataBinding? Wenn da keiner besteht, ändert sich ja die Item-Anzahl in der ListBox nie - und das Löschen aus Originalliste geht weiter und weiter. Bis zum bitteren Exception-Ende.
    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.
    Danke erstmal für eure Antworten.
    ich hatte oben schon die verlinkung gepostet, aber hier einmal der code komplett:

    VB.NET-Quellcode

    1. ​Public Class Form1
    2. Dim OriginalListe As New List(Of Integer)
    3. Dim ZaehlListe(4, 1) As Integer
    4. Dim Anzeigeliste As New List(Of String)
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. OriginalListe.Insert(0, 1)
    7. ListBoxenNeuErstellen()
    8. End Sub
    9. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    10. OriginalListe.Insert(0, 2)
    11. ListBoxenNeuErstellen()
    12. End Sub
    13. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    14. OriginalListe.Insert(0, 3)
    15. ListBoxenNeuErstellen()
    16. End Sub
    17. Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
    18. OriginalListe.Insert(0, 4)
    19. ListBoxenNeuErstellen()
    20. End Sub
    21. Private Sub btnClear_Click(sender As Object, e As EventArgs) Handles btnClear.Click
    22. OriginalListe.RemoveAt(0)
    23. ListBoxenNeuErstellen()
    24. End Sub
    25. Sub ListBoxenNeuErstellen()
    26. 'ListBox1
    27. ListBox1.Items.Clear()
    28. For eintraege As Integer = 0 To OriginalListe.Count - 1
    29. ListBox1.Items.Add(OriginalListe(eintraege))
    30. Next
    31. 'ListBox2
    32. 'Array leeren
    33. For i = 0 To 4
    34. ZaehlListe(i, 0) = 0
    35. Next i
    36. 'Array füllen
    37. For eintraege As Integer = 0 To OriginalListe.Count - 1
    38. If OriginalListe(eintraege) = 1 Then
    39. ZaehlListe(1, 0) = ZaehlListe(1, 0) + 1
    40. ElseIf OriginalListe(eintraege) = 2 Then
    41. ZaehlListe(2, 0) = ZaehlListe(2, 0) + 1
    42. ElseIf OriginalListe(eintraege) = 3 Then
    43. ZaehlListe(3, 0) = ZaehlListe(3, 0) + 1
    44. ElseIf OriginalListe(eintraege) = 4 Then
    45. ZaehlListe(4, 0) = ZaehlListe(4, 0) + 1
    46. End If
    47. Next
    48. 'Übergeben und sortieren
    49. Anzeigeliste.Clear()
    50. Anzeigeliste.Add(ZaehlListe(1, 0) & " Eins")
    51. Anzeigeliste.Add(ZaehlListe(2, 0) & " Zwei")
    52. Anzeigeliste.Add(ZaehlListe(3, 0) & " Drei")
    53. Anzeigeliste.Add(ZaehlListe(4, 0) & " Vier")
    54. Anzeigeliste.Sort()
    55. Anzeigeliste.Reverse()
    56. ListBox2.Items.Clear()
    57. For eintraege As Integer = 0 To Anzeigeliste.Count - 1
    58. ListBox2.Items.Add(Anzeigeliste(eintraege))
    59. Next
    60. End Sub
    61. End Class


    OriginalListe.RemoveAt(OriginalListe.Count -1 ) steht auch in meinem code… keine Ahnung, warum ich es im op nicht schrieb. ich ändere das mal
    Es bleibt dabei: Dein Code

    VB.NET-Quellcode

    1. Do While ListBox1.Items.Count >= FilterRunden
    2. OriginalListe.RemoveAt(OriginalListe.Count -1)
    3. Loop

    bleibt so gesehen Mumpitz. Wenn in der ListBox1 5 Einträge sind und in der TextBox für den "Filter" 3 steht, dann wird durch Umwandlung des Filtertextes in eine Zahl folgendes ausgeführt:
    Solange 5 >= 3: Entferne das letzte Element aus der "Originalliste". Da die 5 und die 3 sich nie ändern, da Du den ListBox1-Inhalt nicht mitänderst, wird irgendwann die Originalliste leer sein. Und würde die Exception nicht kommen, ginge das ganze wohl bis in die Unendlichkeit so weiter.
    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.