Listbox: Mehrere markierte Einträge löschen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von mjd.

    Listbox: Mehrere markierte Einträge löschen

    Moin.

    Ich habe ein Problem mit einer Listbox. Ich schiebe Werte von A nach B und dabei sollen alle markierten Werte aus der einen LB gelöscht werden. Es wird jedoch immer nur ein Eintrag gelöscht. Ich stehe irgendwie auf dem Schlauch. Kann mir jemand helfen? Danke!!!!!!!!

    VB.NET-Quellcode

    1. Private Sub CB_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CB.Click
    2. ' Der Teil klappt problemlos
    3. For Each i As String In Me.LB_Eingelesen.SelectedItems
    4. Me.LB_Loeschen.Items.Add(i)
    5. Next
    6. ' Der Teil leider nicht
    7. For Each i As Integer In Me.LB_Eingelesen.SelectedIndices
    8. Me.LB_Eingelesen.Items.RemoveAt(i)
    9. Next
    10. End Sub

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

    Hallo mjd,

    geh die Löschen-Schleife mal Rückwärts durch, dann müsste es klappen.

    So in der Art,

    VB.NET-Quellcode

    1. For i As Integer = Me.LB_Eingelesen.SelectedIndices To 0 Step -1


    Gruss

    mikeb69
    Moin.

    Vielen Dank erstmal für die Hilfe!!

    Leider geht es so auch nicht. Der Effekt bleibt der Gleiche. Zudem wird Me.LB_Eingelesen.SelectedIndices blau unterstrichen mit dem Hinweis, dass der Wert vom Typ System.Windows.Forms.ListBox.SelectedIndexCollection nicht in Integer konvertiert werden kann.
    Die For-Schleife wird an der Stelle nur einmal durchlaufen - obwohl i nach der Initialisierung den Wert 4 hat?!?!


    VB.NET-Quellcode

    1. For i As Integer = Me.LB_Eingelesen.SelectedIndices To 0 Step -1
    2. Me.LB_Eingelesen.Items.RemoveAt(i)
    3. Next
    Dann weißt du doch was das Problem ist. Der Wert kann nicht in eine Integer Convertiert werden und ist somit "unbrauchbar" zumindest in diesem Zustand, schaumal ob es noch eine ".count()" oder ".length" methode gibt. Also zum Beispiel so:

    VB.NET-Quellcode

    1. For i As Integer = Me.LB_Eingelesen.SelectedIndices.length/.count() To 0 Step -1
    2. Me.LB_Eingelesen.Items.RemoveAt(i)
    3. Next


    ich denke, dass könnte dein Problem lösen.

    lg.
    lg.

    LucaWelker
    In Deiner Frage steht In

    VB.NET-Quellcode

    1. For Each i As Integer In Me.LB_Eingelesen.SelectedIndices
    2. Me.LB_Eingelesen.Items.RemoveAt(i)
    3. Next

    In Deinem letzten Beitrag To

    VB.NET-Quellcode

    1. For i As Integer = Me.LB_Eingelesen.SelectedIndices To 0 Step -1
    2. Me.LB_Eingelesen.Items.RemoveAt(i)
    3. Next

    Da wird ja nur die Anzahl ausgelesen, aber keine Verbindung zur Selektion hergestellt.
    Vielleicht gehst Du in einer Schleife (rückwärts) über alle Items und löschst sie, wenn sie selektiert sind.
    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!
    Hm. Irgendwie stehe ich noch auf dem Schlauch und habe es noch nicht verstanden.

    Die Anzahl der ausgewählten Items bekomme ich mit Me.LB_Eingelesen.SelectedIndices.Count. Leider hilft mir diese Info nur nichts...

    Ich bin ursprünglich davon ausgegangen, dass SelectedIndices ein Array ist, in dem die Indexnummern der Items stehen, die im Status "markiert" sind (sprich: ausgewählt). Daher habe ich das for each ... in ... benutzt, um die Liste der Indizes auszulesen.

    Mein ursprünglicher Code bringt mich beim Next zu einem System.InvalidOperationException-Fehler

    VB.NET-Quellcode

    1. For Each i As String In Me.LB_Eingelesen.SelectedItems
    2.     Me.LB_Loeschen.Items.Add(i)
    3.     Me.LB_Eingelesen.Items.Remove(i)
    4. Next


    Mir fehlt auch gerade der Ansatz, die Eigenschaft selected abzufragen. ein Me.LB_Eingelesen.SelectedItem.Remove gibt es leider nicht.

    Sorry, wenn ich mich gerade ein wenig doof anstelle, aber irgendwie habe ich einen Knoten im Kopf...

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

    Hallo mjd,

    Ich bin ursprünglich davon ausgegangen, dass SelectedIndices ein Array ist, in dem die Indexnummern der Items stehen, die im Status "markiert" sind (sprich: ausgewählt).

    das solte auch so sein.

    Das Problem bei deiner Schleife ist, dass Sie von vorne durch die ListBox läuft.

    Beispiel:
    Deine Listbox enthält 10 Einträge und Eintrag 1 und 10 sind markiert.

    Deine Schleife würde dann Eintrag 1 löschen, 2 - 9 belassen.
    Sobald Eintrag 10 gelöscht werden soll hat deine Listbox ein Problem, denn zu diesem Zeitpunkt sind ja nur noch
    10 - 1 gelöschter Eintrag = 9 Einträge vorhanden.

    Lösung:
    Rückwärts durch die Liste laufen.

    Gruss

    mikeb69
    Probier es mal so:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim jj As System.Windows.Forms.ListBox.SelectedIndexCollection
    3. jj = Me.LB_Eingelesen.SelectedIndices
    4. For i As Integer = jj.Count - 1 To 0 Step -1
    5. Dim ii As Integer = jj.Item(i)
    6. Me.LB_Eingelesen.Items.RemoveAt(ii)
    7. Next
    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!

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

    Mit mikeb69's und Rod's Kommentaren ist mir ein Sack voll Groschen gefallen 8o

    Natürlich gibt es den Eintrag x in den SelectedIndices nicht mehr, wenn ein Eintrag gelöscht wurde!! Natürlich ist es dann x-1!! Manchmal kommt man auf die einfachsten Sachen nicht!! So ist natürlich auch der Schritt über den count und die Rückwärtsschleife vollkommen logisch!!!

    Vielen Dank für die Hilfe!!

    Viele Grüße aus dem Westerwald!!
    mjd