Buttons mit bestimmten Namen löschen (For each)

  • VB.NET

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von Sneeze.

    Buttons mit bestimmten Namen löschen (For each)

    So jetzt ein Problem an dem ich wohl schon länger sitze :D

    Um was gehts
    Es sollen alle Buttons die den Namen "Max" enthalten gelöscht werden.

    Wo ist das Problem
    Es werden nur 2-3 Buttons gelöscht. Das Problem wird zur Zeit unschön mit einer While Schleife gelöst.

    Aktueller Code

    VB.NET-Quellcode

    1. Dim z As New Integer
    2. While z < 70
    3. For Each Control As Control In Me.Controls
    4. If TypeOf Control Is Button And Control.Name.Contains("Max") Then
    5. Me.Controls.Remove(Control)
    6. End If
    7. z += 1
    8. Next
    9. End While


    Ich hab auch schon mehrere Varianten ausprobiert, wenn ich es durchnummerieren lasse dann löscht es auf einmal gar nichts mehr (z.B.: For i As Integer = Me.Controls.Count - 1 To 0 Step -1)


    Kann mir jemand einen Denkanstoß geben wie ich das lösen kann, wäre echt sehr glücklich.

    PS: Es handelt sich um 5 Buttons und die Buttons müssen weg, weil danach auf dieser Fläche gezeichnet wird. Das ganze ist in einem Private Sub und wird nur einmal gegen Ende ausgeführt.
    Warum machst Du das überhaupt 70mal? Einmal durchlaufen reicht doch?

    Jedenfalls würde ich es so machen:

    VB.NET-Quellcode

    1. For Each btn As Button In Me.Controls.OfType(Of Button).Where(Sub(b) b.Name.Contains("Max"))
    2. // Löschen
    3. Next


    Dafür musst Du System.Linq.Extensions importieren. Sind Deine Buttons alle in diesem Control oder hast Du noch irgendwelche TabPages/Panels o.ä.?

    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 :!:
    Hallo,

    hab mich eventuell schlecht ausgedrückt. Die Buttons sind auf der Windows Form und ich hab zwar den Code schon abgeändert allerdings krieg ich ihn nicht wirklich zum laufen. Hab den Verweis importiert, die Namen angepasst - aber:

    Fehler BC30518 Fehler bei der Überladungsauflösung, da keine zugreifbare "Where" mit diesen Argumenten aufgerufen werden kann:
    Erweiterungsmethode "Public Function Where(predicate As Func(Of Button, Boolean)) As IEnumerable(Of Button)" in "Enumerable" definiert: Die Signatur des geschachtelten Sub ist nicht mit dem Delegaten "Func(Of Button, Boolean)" kompatibel.
    Erweiterungsmethode "Public Function Where(predicate As Func(Of Button, Integer, Boolean)) As IEnumerable(Of Button)" in "Enumerable" definiert: Die Signatur des geschachtelten Sub ist nicht mit dem Delegaten "Func(Of Button, Integer, Boolean)" kompatibel.



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

    Tschuldige, mein Edit hat's kaputt gemacht. Muss statt Sub eine Function sein, da ja ein Rückgabewert für das Predicate vorhanden ist. Lambda-Ausdrücke in C# sind einfach simpler. :rolleyes:

    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 :!:
    Super, hab es jetzt zum laufen gebracht. Nur entfernt es immer noch nicht alle Buttons:

    Erstes Mal: Löscht 3 Buttons
    Zweites Mal: Die restlichen 2 Buttons

    Aber es ist schon mal eine deutliche Verbesserung zu meinen vorherigen Code. Da hat es ~50-70 Durchläufe gebraucht. Jetzt sind es nur noch 6 Durchläufe die er benötigt.

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

    Öhm, Du weißt schon, wie ​For Each arbeitet? Das läuft alle Buttons durch, Du musst da nichts wiederholen. Das wäre doppelt gemoppelt und entfernt auch nicht mehr.

    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 :!:
    Das sollte aber nicht passieren. Das liegt dann an etwas anderem, aber nicht an der Schleife. Wie gesagt, was soll die denn anderes machen? Die iteriert nur durch alle Buttons, die vorhanden sind. Auch, wenn Du sie 1000mal wiederholst.

    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 :!:
    Hab jetzt ein kleines Video gemacht, die Qualität ist jetzt nicht so gut - aber ich denke man sieht alles



    Der benutze Code

    VB.NET-Quellcode

    1. Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
    2. For Each btn As Button In Me.Controls.OfType(Of Button).Where(Function(b) b.Name.Contains("Max"))
    3. Me.Controls.Remove(btn)
    4. Next
    5. End Sub


    Ist meine Remove Anweisung vielleicht fehlerhaft?

    Nachtrag: Wenn man den Thread schlafen lässt (100ms) - sieht man sehr schön das er nur bis zum dritten Button geht und dann aufhört.
    Das Video ist privat. Stell es auf "nicht gelistet".

    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 :!:
    Zeig mal Deinen kompletten Code.

    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 :!:
    Das ist der komplette Code vom Beispiel^^ Den Verweis habe ich weg gelassen da er nicht benötigt wird laut VB

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button7_Click(sender As Object, e As EventArgs) Handles Button7.Click
    3. For Each btn As Button In Me.Controls.OfType(Of Button).Where(Function(b) b.Name.Contains("Max"))
    4. Me.Controls.Remove(btn)
    5. Next
    6. End Sub
    7. End Class
    Wie heißen denn Deine Buttons?

    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 :!:
    Jetzt mal Schuss ins Blaue, aber eigentlich ein alter Hut: "never change a running for each loop" (oder so ähnlich). Wenn man ne For Each Schleife laufen lässt, sollte man die Auflistung nicht ändern, da sonst Elemente (in diesem Fall) übersprungen werden. Daher eher sowas wie:

    VB.NET-Quellcode

    1. Dim ListOfControlsToDelete As New List(Of Control)
    2. For Each Control As Control In Me.Controls
    3. If TypeOf Control Is Button And Control.Name.Contains("Max") Then
    4. ListOfControlsToDelete.Add(Control)
    5. End If
    6. Next
    7. For Each Control In ListOfControlsToDelete
    8. Me.Controls.Remove(Control)
    9. Next
    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.
    VaporiZed hat glaub ich recht. Ich habe nicht bedacht, dass Du den Iterator jedes Mal änderst. Es geht ja ums Entfernen. Dadurch kann sich natürlich das Zeugs verschieben. Wundert mich, dass Du da keine Exception bekommst. Oo

    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 :!:
    Bah darauf hätte ich selbst kommen können! Vielen Dank, ich habe es auch schon mit einer Nummerierung probiert - allerdings war mein Ansatz nicht so gut :D

    Wundert mich auch, ich habe aber auch die Menge so angepasst das es perfekt alle auf einmal entfernt. Ein Problem wird es erst, wenn es nichts zum entfernen hat - dann friert die Form ein.

    Sneeze schrieb:

    und die Buttons müssen weg, weil danach auf dieser Fläche gezeichnet wird.
    Wieso gibt es denn diese Buttons ühaupt?
    eicht es nicht einfach, diese Buttons mit .Visible = False unsichtbar zu machen?
    Weil nächste Woche kommst Du und fragst, wie Du die gelöschten Buttons wieder herzaubern kannst, weil sie doch noch gebraucht werden.
    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!
    Ich sehe das wie @RodFromGermany, wenn die Buttons gelöscht sind musst du sie zur Laufzeit entweder wieder hinzufügen, oder das Programm neu starten damit sie wieder da sind.
    Wenn Du ne Fläche zum zeichnen brauchst, nimm doch ein TabConrol, da kannst Du zur Not die Header ausblenen (gibts hier im Forum auch genug Codes für) und die Buttons würd ich dann ausblenden.
    Ansonsten beschreib doch mal die Grundidee, die Du da hast, vielleicht gibts ja auch andere Lösungsansätze.
    "Hier könnte Ihre Werbung stehen..."