Probleme beim Löschen dynamischer CheckBoxen

  • VB.NET
  • .NET (FX) 4.0

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Probleme beim Löschen dynamischer CheckBoxen

    Moin moin,

    ich habe ein Programm, das unter anderem Daten aus einer Datenbank ausliest und daraus dynamische CheckBoxen erstellt.
    Das Klappt auch alles ganz schön und gut, außer wenn ich versuche, sie zu löschen.
    Bei der Namensgebung habe ich eine for-Schleife benutzt und sie dann folgendermaßen benannt

    VB.NET-Quellcode

    1. ...
    2. check(i).Name = "Check" & i
    3. ...


    Wenn ich sie über folgenden Code wieder versuche zu löschen, hakt es allerdings

    VB.NET-Quellcode

    1. For Each check As CheckBox In Me.gbRechte.Controls.OfType(Of CheckBox)()
    2. If check.Name.StartsWith("Check") Then
    3. gbRechte.Controls.Remove(check)
    4. check.Dispose()
    5. End If
    6. Next

    Erst, wenn ich den die ForEach-Schleife mehrfach durchlaufe, werden wirklich alle CheckBoxen entfernt.
    Vorher nur stückweise

    Hat jemand eine Idee, woran das liegen könnte?

    Mit freundlichen Grüßen
    Xen
    Ja Elemente aus einer For Each Schleife löschen die man gerade durchläuft ist ein Problem.
    Gehe es mit einer For i= Controls.Count, i-- Schleife rückwärts durch und lösche die Elemente.

    LG
    Das ist meine Signatur und sie wird wunderbar sein!
    Hey Mono,

    danke für deine schnelle Antwort.
    Leider habe ich dies bereits versucht, sowohl von 0 zu .Count, als auch umgekehrt.
    Ich muss das ganze leider variabel haben, weil sich durch Datenbankänderungen neue CheckBoxen generieren lassen, ohne etwas am Code zu ändern (was auch so bleiben soll).

    MfG
    Leider habe ich dies bereits versucht, sowohl von 0 zu .Count, als auch umgekehrt.


    Und was ist dabei rausgekommen? Kann mir nicht vorstellen das wenn du es rückwärts entfernst es Probleme gibt.
    Zeig mal deinen Code dafür.
    Das ist meine Signatur und sie wird wunderbar sein!
    Hallo,

    also zuerst würde ich den Namen von den dyn CheckBoxen nicht mit "check" beginnen. Ich verwende idR "CB_" & i... (persönliche Meinung)
    Und .StartWith war mir bis dato nicht bekannt. Ich nutze immer .instr().
    Nun aber zurück zur Frage:

    Ich hatte dieses Problem auch mal, aber frage mich nicht woran das liegt. Beseitigt habe ich es dann wenig elegant:

    VB.NET-Quellcode

    1. For i as Integer = 0 to 1
    2. For Each oCheckBox as CheckBox In Me.gbRechte.Controls.OfType(Of CheckBox)()
    3. If Microsoft.VisualBasic.Strings.InStr(oCheckBox.Name, "CB_", CompareMethod.Text) <> 0 Then
    4. gbRechte.Controls.Remove(check)
    5. gbRechte.Update
    6. End If
    7. Next oCheckBox
    8. next i


    Ich hoffe es hilft bei dir auch...
    Grüße
    ZUnächst ein Willkommen im Forum. :thumbup:

    Xen schrieb:

    Ich muss das ganze leider variabel haben
    Sollte nicht das Problem sein, wichtig ist, dass Du die Schleife von hinten nach vorn durchläufst, weil das Löschen eines Controls den Container ändert, und das während eines dynamischen Zugriffs.
    Nicht getestet:

    VB.NET-Quellcode

    1. For i = gbRechte.Controls.Count - 1 to 0 Step -1
    2. If TypeOf gbRechte.Controls(i) Is CheckBox Then
    3. Dim cb = CType(gbRechte.Controls(i), CheckBox)
    4. If cb.Name.StartsWith("Check") Then
    5. gbRechte.Controls.Remove(cb)
    6. cb.Dispose()
    7. End If
    8. End If
    9. Next

    ====
    @Icke Lass es sein.
    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!
    Vollzitat entfernt

    Vielen Dank!

    Mein Code (von hinten nach vorn) sah vorher so aus

    VB.NET-Quellcode

    1. Dim check As CheckBox()
    2. For i As Integer = Me.gbRechte.Controls.OfType(Of CheckBox).Count() - 1 To 0 Step -1
    3. If check(i).Name.StartsWith("Check") Then
    4. gbRechte.Controls.Remove(check(i))
    5. check(i).Dispose()
    6. End If
    7. Next


    Mit deinem hat es jetzt aber endlich geklappt. Dafür auch noch mal ein dickes Dankeschön!

    MfG

    ~blaze~: Vollzitat entfernt

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

    Hallo @RodFromGermany,

    ich wüsste nicht wie... Denn ich habe ein DGV und mit hinzufügen einer Zeile werden in einem Panel (1x Label, 2x Picturebox) hinzugefügt.
    Der User kann aber im DGV (count = 10) zeile 3 entfernen und dann muss auch das dazugehörige Label und die zwei PictureBoxen entfernt
    werden. Alle anderen werden dann, an Hand der dgv.row.index neu nummeriert. Und da ich maximal 2 PictureBoxen haben kann muss ich die
    For Each schleife zweimal durchlaufen.

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

    Vollzitat entfernt

    Naja mein Ziel war es ja, nicht x mal eine Schleife durchlaufen zu müssen und da konnte mir @RodFromGermany echt gut weiterhelfen.

    ~blaze~: Vollzitat entfernt

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

    Icke schrieb:

    ich wüsste nicht wie
    Welche Funktion haben Deine zwei ineinandergeschachtelten For-Schleifen?
    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!