Visual Basic 2010 Dynamisch erstellte Controls durch contextmenustrip löschen

  • VB.NET

Es gibt 32 Antworten in diesem Thema. Der letzte Beitrag () ist von ClonkAndre.

    Visual Basic 2010 Dynamisch erstellte Controls durch contextmenustrip löschen

    Hallo liebe Community!

    Ich sitze mal wieder in der Zwickmühle..
    Undzwar möchte ich Dynamisch erstellte Controls wieder löschen.. Soweit so gut.
    So wenn ich auf einen Knopf drücke wird dieses Control erstellt zudem wird auch auf diesem Control ein neues Contextmenustrip erzeugt mit dem Inhalt "Element Löschen". Wenn man da draufdrückt soll das Element wo man drauf geklickt hat gelöscht werden..

    So weit mein Code:

    VB.NET-Quellcode

    1. Private Sub Delete(sender As Object, e As EventArgs)
    2. Try
    3. 'Hier soll der Code für's löschen hinkommen
    4. Catch ex As Exception : End Try
    5. End Sub


    Tja wie macht man sowas?
    Danke im vorraus! :thumbsup:
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    Du musst sie aus deren Host (der Container zu dem die Controls hinzugefügt wurden) entfernen (mit .Remove) anschließend kannst du sie Disposen.
    Ebenfalls braucht man hier kein TryCatch, wenn man mögliche Fehlerquellen selber abfängt. Sender as Object sowie E as EventArgs sind ebenfalls in so einer Methode fehl am platz.

    VB.NET-Quellcode

    1. Private Sub DeleteControl(c As Control)
    2. If c.Parent IsNot Nothing Then
    3. Dim host As Control = CType(c.Parent, Control)
    4. host.Controls.Remove(c)
    5. c.Dispose()
    6. End If
    7. End Sub


    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    Vielen Dank für dein Code doch da gibt es ein Problem (Problembild im Anhang)
    Leider wird DeleteControl blau unterstrichen :(

    VB.NET-Quellcode

    1. ctms.Items.Add("Element Löschen", Nothing, AddressOf DeleteControl)

    Bilder
    • fehler.png

      4,4 kB, 1.105×43, 174 mal angesehen
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    @ClonkAndre Offensichtlich hast Du Deine Methode aus aus Post 1 umbenannt, ohne die Argumente dieser Prozedur dem Post von @Gather anzupassen.
    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!
    @RodFromGermany
    Hmm... Also ich kann mit gutem gewissem sagen das ich alles übernommen habe der Name vom Sub alles .. :/
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!

    ClonkAndre schrieb:

    Name vom Sub alles
    Dann gibt es bei Dir bereits eine Sub diesen Namens oder Du hast beim Aufruf der Prozedur von @Gather die falschen Parameter reingeschrieben.
    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!
    @RodFromGermany
    Wenn ich die Sub DeleteControl aufrufen möchte, was muss ich denn in den Klammern hinein schreiben?
    Ich habe nähmlich keine anderen Sub's mit diesem Namen.
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!

    ClonkAndre schrieb:

    was muss ich denn in den Klammern hinein schreiben?
    Siehe Post #2 von @Gather . Was würdest Du denn dem Namen dieser Prozedur entnehmen, was da drin stehen könnte?
    Der @ErfinderDesRades würde sagen: Nomen est Omen.
    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!
    Also ich würde darin schreiben: Panel1 denn in diesem werden die ganzen Controls erstellt doch wenn ich Panel1 hinein schreibe funkt es trotzdem nicht

    //EDIT
    Im Foto seht ihr was passiert wenn ich Panel1 in den klammern schreibe
    Bilder
    • fehler1.png

      3,75 kB, 676×60, 175 mal angesehen
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!

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

    @ClonkAndre Jetzt ist was nach hinten losgegangen.
    Dass Du da was bei AddressOf eintragen wolltest, war mir nicht klar, denn da steht nur der Prozedurname.
    Das System erwartet an dieser Stelle eine Prozedur welchen Namens auch immer, der die vorgegebenen Parameter haben muss.
    Poste mal so viel Code, um das vollständig nachvollziehen zu können. Teste den von Dir zu postenden Code in einem neuen Projekt, damit wir nicht nochmals nachfragen müssen.
    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!
    @RodFromGermany

    Mein Code damit man es etwas verstehen könnte:

    VB.NET-Quellcode

    1. Private Sub new_image_object(ByVal image_location As String, ByVal location As System.Drawing.Point) 'Erstellt ein neues Objekt
    2. Dim new_picbox As New PictureBox
    3. Dim ctms As New ContextMenuStrip
    4. 'ContextMenuStrip
    5. ctms.Items.Add("In den Vordergrund", Nothing, AddressOf tofront)
    6. ctms.Items.Add("In den Hintergrund", Nothing, AddressOf toback)
    7. ctms.Items.Add("Element Verkaufen", Nothing, AddressOf DeleteControl)
    8. 'Object
    9. new_picbox.ContextMenuStrip = ctms
    10. new_picbox.ImageLocation = image_location
    11. new_picbox.Location = location
    12. 'Bewegung der PicBox
    13. AddHandler new_picbox.MouseDown, AddressOf Control_MouseDown
    14. AddHandler new_picbox.MouseMove, AddressOf Control_MouseMove
    15. AddHandler new_picbox.MouseUp, AddressOf Control_MouseUp
    16. 'PicBox wird zum Panel hinzugefügt
    17. Panel1.Controls.Add(new_picbox)
    18. End Sub
    19. Private Sub tofront(sender As Object, e As EventArgs) 'Wenn man auf das Contextmenustrip Item "In den Vordergrund" klickt tu das
    20. Try
    21. DirectCast(DirectCast(sender, ToolStripMenuItem).Owner, ContextMenuStrip).SourceControl.BringToFront()
    22. Catch ex As Exception : End Try
    23. End Sub
    24. Private Sub toback(sender As Object, e As EventArgs) 'Wenn man auf das Contextmenustrip Item "In den Hintergrund" klickt tu das
    25. Try
    26. DirectCast(DirectCast(sender, ToolStripMenuItem).Owner, ContextMenuStrip).SourceControl.SendToBack()
    27. Catch ex As Exception : End Try
    28. End Sub
    29. Private Sub DeleteControl(c As Control) 'Wenn man auf das Contextmenustrip Item "Element Verkaufen" klickt tu das
    30. If c.Parent IsNot Nothing Then
    31. Dim host As Control = CType(c.Parent, Control)
    32. host.Controls.Remove(c)
    33. c.Dispose()
    34. End If
    35. End Sub

    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    @ClonkAndre So was:

    VB.NET-Quellcode

    1. Private Sub DeleteControl(sender As Object, e As EventArgs) 'Wenn man auf das Contextmenustrip Item "Element Verkaufen" klickt tu das
    2. Dim c As Control = DirectCast(sender, Control)
    3. If c.Parent IsNot Nothing Then
    4. Dim host As Control = CType(c.Parent, Control)
    5. host.Controls.Remove(c)
    6. c.Dispose()
    7. End If
    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!
    @RodFromGermany

    Es wird schon mal nichts mehr Blau unterstrichen im Code but:

    //Edit
    Habe schon überlegt ob es vielleicht mit Owner funktionieren würde aber ich denke nicht

    Bilder
    • fehler2.png

      43,83 kB, 899×315, 168 mal angesehen
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!

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

    @ClonkAndre AHa. Das ist eine Component und kein Control.
    Teste erst den Typ und caste dann entsprechend dahin.
    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!
    Grundsätzlich habe ich dir doch ein zu eins die Methode gegeben.. du musst lediglich für 'Hos't das entsprechende Control einsetzen..
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    @Gather
    Wie meinst du das genau mit "einsetzen" ?

    //Edit
    Wenn ich deinen Sub in mein Projekt einbaue und dann mit Addressof aufrufen möchte bekommen ich einen Fehler (Bild vom Fehler einmal in Post #3 und #9)
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!

    ClonkAndre schrieb:

    einsetzen
    Dein Control / Component als Parameter einer Prozedur.
    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!
    @RodFromGermany
    Meint Ihr so:

    VB.NET-Quellcode

    1. ctms.Items.Add("Element Löschen", Nothing, AddressOf DeleteControl(panel1) '<--- Panel1 ist der Container wodrin sich die Dynamisch erstellten Controls befinden die gelöscht werden können
    Wenn ich dir auf irgendeiner Art und Weise helfen konnte, drück doch bitte den "Hilfreich" Button :thumbup:

    Für VB.NET Entwickler: Option Strict On nicht vergessen!
    @ClonkAndre Nö.
    Wir hatten doch bereits oben gesehen, dass solch Aufruf die Signatur eines Eventhandlers hat.
    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!