Erstellten Panel wieder löschen / Button Befehl geben

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von Cell.

    Erstellten Panel wieder löschen / Button Befehl geben

    Hallo,
    ich habe ein FlowLayoutPanel, dort werden z.B. 3 Panels hinzugefügt. Dort werden dann auch jeweils Buttons hinzugefügt.

    Um das ganze zu veranschaulichen :

    PANEL 1 , BUTTON 1
    PANEL 2 , BUTTON 2
    PANEL 3 , BUTTON 3

    So wenn man jetzt auf einen Button drückt, soll das dazugehörende Panel gelöscht werden.
    Also wenn ich z.B. BUTTON 2 klicke soll PANEL 2 gelöscht werden. Drücke ich BUTTON 1 soll auch PANEL 1 gelöscht werden.

    Ich weiß das man z.B. newPanel.dispose ein spezielles Panel löschen kann, ich brauche aber, wie oben erwähnt, das immer das dazugehörige Panel gelöscht wird.

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

    So in der Art sollte das gehen...

    VB.NET-Quellcode

    1. Private Sub btn_Click(sender As Object, e As System.EventArgs) Handles button1.Click, button2.Click, button3.Click, ...
    2. Dim btn = DirectCast(sender, Button) 'Button aus sender casten...
    3. Dim pnl = DirectCast(btn.Parent, Panel) 'Container(Panel), wo sich der Button befindet, feststellen...
    4. pnl.Dispose()
    5. End Sub
    Also danke erstmal, ja so funktioniert das, super.

    Aber leider habe ich da nun ein kleines Problem, bei mir klappt es nicht dem Button den Befehl zuzuordnen.

    Ich erstelle über eine Public Function ein Panel + Button, das funktioniert auch einwandfrei, aber wie kann ich nun dem Button den Befehl zuweisen ?
    Bei mir will das einfach nicht funktionieren.

    VB.NET-Quellcode

    1. Public Function AddPanel()
    2. Dim newPanel As Panel = New Panel
    3. newPanel.BorderStyle = BorderStyle.FixedSingle
    4. newPanel.Size = New Size(660, 229)
    5. newPanel.Visible = True
    6. newPanel.BackColor = Color.LightGray
    7. Main.MainPanel.Controls.Add(newPanel)
    8. Dim newButton As Button = New Button
    9. newButton.FlatStyle = FlatStyle.Popup
    10. newButton.Visible = True
    11. newButton.BackColor = Color.LightGray
    12. newButton.Location = New Point(3, 34)
    13. newButton.Text = "Löschen"
    14. newButton.Size = New Size(95, 31)
    15. newPanel.Controls.Add(newButton)
    16. End Function


    Also ich kann damit unlimitiert Panels adden und später soll dies auch unlimitiert sein.


    Danke
    Also irgendwie geht das nicht bzw bekomme ich das nicht hin.

    VB.NET-Quellcode

    1. ​Public Class Main
    2. Private WithEvents btnClose As Button


    nachdem ich dann den button hinzufüge, füge ich gleich im nachhinein hinzu :

    VB.NET-Quellcode

    1. ​AddHandler btnClose, AddressOf btnClose_click


    Da kommt der Fehler btnClose ist kein Ereignis von Main

    VB.NET-Quellcode

    1. 'Hier steht der Code um den Button hinzuzufügen
    2. AddHandler newButton.Click, AddressOf NewButton_Click
    3. '...
    4. Private Sub newButton_Click(sender As Object, e As System.EventArgs)
    5. MsgBox("Button wurde geklickt")
    6. End Sub
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^
    Genau so habe ich es auch ^^

    Also eher so, in meinem Timer, wird ein Eintrag überprüft und stimmt dieser mit dem gegeben Wert überein, wird das Panel erstellt. In diesem Panel der Button.

    VB.NET-Quellcode

    1. Dim btnClose As Button = New Button
    2. btnClose.FlatStyle = FlatStyle.Popup
    3. btnClose.Visible = True
    4. btnClose.BackColor = Color.LightGray
    5. btnClose.Location = New Point(3, 34)
    6. btnClose.Text = "Löschen"
    7. btnClose.Size = New Size(95, 31)
    8. newPanel.Controls.Add(btnClose)
    9. AddHandler btnClose, AddressOf btnClose_click


    Danach

    VB.NET-Quellcode

    1. Private Sub btnClose_Click(sender As Object, e As System.EventArgs)
    2. Dim btn = DirectCast(sender, Button)
    3. Dim pnl = DirectCast(btn.Parent, Panel)
    4. pnl.Dispose()
    5. End Sub


    Folgender Fehler :"btnClose" ist kein Ereignis von Main.
    Schau dir mal Zeile 2 von meinem Code oben GENAUER an:

    VB.NET-Quellcode

    1. AddHandler newButton.Click, AddressOf NewButton_Click


    In deinem Fall:

    VB.NET-Quellcode

    1. AddHandler btnClose.Click, AddressOf btnClose_Click


    Edit: Da war ich wohl ein paar Sekunden schneller^^
    „Was ich gerade mache? Ich reite Hand in Hand mit dem Matthäus-Effekt auf einer Exponentialfunktion.“ ^^

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

    Jason95 schrieb:

    VB.NET-Quellcode

    1. AddHandler btnClose, AddressOf btnClose_click
    Lesen können ist von Vorteil.

    Mikro Fahrrad schrieb:

    VB.NET-Quellcode

    1. AddHandler newButton.Click, AddressOf NewButton_Click
    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!
    Eine allerletze Frage habe ich noch, sonst funktioniert alles bisjetzt :

    Ich füge ja newPanel ein, aber damit das Panel nicht doppel vorhanden ist, würde ich es gerne löschen.

    aber wenn ich

    VB.NET-Quellcode

    1. For i As Integer = Me.Controls.Count - 1 To 0 Step -1
    2. If Controls(i).Name.Contains("bnr") Then Controls.RemoveAt(i)
    3. Next


    versuche, funktioniert das leider nicht. Zur Erklärung : Ich nenne meine Panels "bnr" & line (line ist jeweils immer StreamReader.ReadLine)
    Hier wird das Panel geaddet :



    VB.NET-Quellcode

    1. Dim strr As New StreamReader(New FileStream("ItemListe.txt", FileMode.Open))
    2. Dim line As String
    3. Do
    4. line = strr.ReadLine()
    5. If line = Nothing Then
    6. Else
    7. [...]
    8. Dim newPanel As Panel = New Panel
    9. newPanel.Name = "bnr" & line
    10. MainPanel.Controls.Add(newPanel)
    11. [...]
    12. End If
    13. Loop Until line Is Nothing


    ItemListe.txt : Enthält einige Einträge mit Namen welche ich im späteren Verlauf nutze. Deswegen dachte ich benenne ich die Panels auch nach den Namen. ("bnr" & line) bilden hier den Namen des Panels. "bnr" nutze ich als Abkürzung für Benachrichtigung, aber das ist eher unwichtig. 'line' ist der aktuelle Name, als Beispiel : Item1 / Item2 / Item3 / Item4 / Item5 ...

    MainPanel : ist ein FlowLayOutPanel, hier werden die Panels eingereiht.


    Ich dachte ich kann einfach eine Abfrage einfügen, bevor das Panel erstellt wird, also quasi wird das alte gelöscht und das neue sofort nachgeschoben.
    Leider hat es nicht so funktioniert wie ich es erhofft habe
    ja, da hamwas doch:
    Vergleiche

    Jason95 schrieb:

    For i As Integer = Me.Controls.Count - 1 To 0 Step -1
    mit

    Jason95 schrieb:

    MainPanel.Controls.Add(newPanel)


    Natürlich ist Me was anderes als Mainpanel, also wie gesagt:

    ErfinderDesRades schrieb:

    Lösche die Controls da heraus, wo sie auch eingefügt wurden

    VB.NET-Quellcode

    1. For i As Integer = MainPanel.Controls.Count - 1 To 0 Step -1
    2. If Controls(i).Name = "bnr" & line Then Controls.RemoveAt(i)
    3. Next


    Funktioniert aber auch nicht, passiert einfach nichts wie vorher.


    EDIT :

    VB.NET-Quellcode

    1. For i As Integer = Me.MainPanel.Controls.Count - 1 To 0 Step -1
    2. If MainPanel.Controls(i).Name = "bnr" & line Then MainPanel.Controls.RemoveAt(i)
    3. Next


    So funktioniert, es sorry das ich es nicht gleich geschnallt habe.
    Danke :)
    @Jason95 Wenn Du das Panel gelöscht hast, kannst Du die Schleife auch gleich verlassen, da Du nur ein Panel suchst:

    VB.NET-Quellcode

    1. For i As Integer = Me.MainPanel.Controls.Count - 1 To 0 Step -1
    2. If MainPanel.Controls(i).Name = "bnr" & line Then
    3. MainPanel.Controls.RemoveAt(i)
    4. Exit For
    5. End If
    6. Next
    Und: Warum löschst Du das Panel und fügst es neu hinzu?
    Du kannst es auch reaktivieren.
    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!
    Weil das auf diese Weise schneller geht, sonst müsste ich jedem Control (von den 15 Labels, 4 buttons und einer Checkbox) neuen Text zuweisen. Würde bestimmt längern dauern.
    Also nicht vom Programm aus, sondern eher zum programmieren, wenn man das programmieren nennen kann x)

    Jason95 schrieb:

    Also nicht vom Programm aus, sondern eher zum programmieren
    :?:
    Was meinst Du damit?
    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!
    Naja, man müsste ja wieder jedes control einzeln ansteuern und den Wert neu eintragen. Da kann ich mir ja Arbeit sparen, dass Panel löschen und einfach das neue erstellen.
    Ich meine rein Technisch gesehen entstehen dadurch ja keine Nachteile, nehme ich an.