Im Code erstellte Buttons löschen

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Im Code erstellte Buttons löschen

    Hallo zusammen,

    Ich erstelle wie folgt meine Buttons:

    VB.NET-Quellcode

    1. newButton = New Windows.Forms.Button
    2. newButton.Name = "btnButton" & i
    3. newButton.Text = TblServiceMonteureDataGridView.Item(1, i).Value()
    4. newButton.Top = 150 + u1 * 30
    5. newButton.Left = 410
    6. AddHandler newButton.Click, AddressOf ButtonClicked
    7. Me.Controls.Add(newButton)


    Ist es möglich diese Buttons wieder zu löschen?

    Vielen Dank für die Hilfe.

    Gruss Schnibli
    Antwort: ja

    Langform:

    VB.NET-Quellcode

    1. RemoveHandler NewButton.Click, AddressOf ButtonClicked
    2. Me.Controls.Remove(newButton)
    3. newButton.Dispose

    newButton habe ich jetzt nur verwendet, damit der Zusammenhang bleibt. Ich glaube aber irgendwie nicht, dass Du den Button in der selben Prozedur löschen willst, in der er erstellt wurde. Von daher muss dann newButton natürlich später anderweitig festgelegt werden, also dem Programm klargemacht werden, welcher Button gelöscht werden soll.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @schnibli Aus welchem Grund erstellst Du Buttons im Code?
    Der Eventhandler dieses Buttons bleibt doch weiterhin im Code / der Exe stehen.
    Wäre es nicht besser, einfach die Buttons im Designer zu erstellen und sie dann per .Visible zu schalten?
    ====
    Falls jetzt als Antwort kommt: Ich mach da ein Spiel und je nachdem habe ich 100 bis 200 Buttons - das wäre ein krasses Fehldesign.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    Hallo,

    Der grund dazu ist, das ich anhand von Datenbanken Labels und Buttons erstelle.
    Das mit dem button hat funkitoniert. Nun bin ich daran, Labels anhand einer Tabelle zu erstellen:

    VB.NET-Quellcode

    1. 'Label erstellen
    2. For Zeile As Integer = 0 To TblTaetigkeitenKalkBindingSourceLabel.Count - 1
    3. TblTaetigkeitenKalkBindingSourceLabel.Position = Zeile
    4. Dim summe As Integer = 0
    5. For i As Integer = 0 To TblProjekt_kalkDataGridView.Rows.Count - 1
    6. If (TblProjekt_kalkDataGridView.Rows(i).Cells(2).Value = TblTaetigkeitenKalkBindingSourceLabel.Current("id")) Then
    7. summe += CInt(TblProjekt_kalkDataGridView.Rows(i).Cells(6).Value)
    8. End If
    9. Next
    10. u1 = u1 + 1
    11. Dim mylabel As New Label
    12. mylabel.Text = TblTaetigkeitenKalkBindingSourceLabel.Current("bemerkung") & " : " & summe
    13. mylabel.Top = 98 + u1 * 30
    14. mylabel.AutoSize = True
    15. mylabel.Left = 11
    16. Me.Controls.Add(mylabel)
    17. Me.SplitContainer3.Panel2.Controls.Add(mylabel)
    18. Next


    VB.NET-Quellcode

    1. 'Labels löschen
    2. Dim mylabel As New Label
    3. Me.SplitContainer3.Panel2.Controls.Remove(myLabel)
    4. myLabel.Dispose()


    Nun dies Funktioniert nicht, das Programm löscht die Labels leider nicht -.-

    Ich benötige die Funktion weil:
    Je nach dem welcher Datensatz angeklickt ist, müssen die Labels die beschriftung ändern.

    Gruss Schnibli

    schnibli schrieb:

    ch benötige die Funktion weil:
    Je nach dem welcher Datensatz angeklickt ist, müssen die Labels die beschriftung ändern.

    Aber wozu musst du diese dann löschen? du musst ja nur die Beschriftung ändern oder habe ich das falsch verstanden?

    Grüße
    Sascha
    If _work = worktype.hard Then Me.Drink(Coffee)
    Seht euch auch meine Tutorialreihe <WPF Lernen/> an oder abonniert meinen YouTube Kanal.

    Rene M. schrieb:

    Wenn du es zwei Mal addest, musst du es auch zwei Mal disposen.
    Das ist falsch!
    Das Hinzufügen des Labels zu einem Panel entfernt es automatisch aus dem anderen Panel.
    Außerdem handelt es sich um dieselbe Instanz.
    Teste dies:
    Form mit 2 Button, 2 Panel und einem Label

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Me.Panel1.Controls.Add(Label1)
    4. End Sub
    5. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    6. Me.Panel2.Controls.Add(Label1)
    7. End Sub
    8. End Class
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    erstens: Wird innerhalb der Schleife jedes Mal eine neue Instanz des Labels erzeugt
    zweitens: deine Code für Label löschen hat keinerlei Bezug zu den weiter oben erzeugten Labeln.

    Erzeuge Label und gib ihnen einen eindeutigen Namen (ID).

    Löschen kannst du sie dann über diese Referenze:


    Quellcode

    1. ​ For x = 0 To 4
    2. Dim l As New Label
    3. l.Width = 20
    4. l.Height = 20
    5. l.Text = x.ToString
    6. l.Left = 40
    7. l.Top = 20 + x * 20
    8. l.Name = x.ToString
    9. Me.Controls.Add(l)
    10. Next
    11. Me.Controls("0").Dispose()
    12. Me.Controls("1").Dispose()
    13. Me.Controls("2").Dispose()
    @Rene M. Dein Code ist suboptimal,
    Du erzeugst 5 Label und disposest nur 3 davon.
    ====
    Solche Controls gehören im Designer erzeugt!
    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).
    VB-Fragen über PN / Konversation werden ignoriert!
    kann es sein, dass es eine Sucht von Dir ist, einfach was zu schreiben?

    Dass ich nur Beispielcode schrieb, liegt doch auf der Hand.
    Ich habe klar gemacht, warum in seinem Code die Labels nicht gelöscht werden.

    PS: ob ein Control vom Designer oder zur Laufzeit erzeugt werden soll, hast wohl nicht du zu entscheiden.

    @schnibli: wie gesagt, erzeuge die Label mit eindeutiger Bezeichnung und lösche sie genau darüber via Dispose.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Rene M.“ ()

    Also bevor Ihr euch die Köpfe einschlägt.

    Ich finde auch, dass wenn schon so viele Buttons gebraucht werden, diese gleich in ein entsprechendes Control eingepflegt werden. Klar muss man den Datensatz entsprechend ändern. Das setzt schon ein bisschen Grundbasis voraus. Aber der Erfolg lässt sich z.B. mit einem DataGridView nachher klar zum Vorteil nutzen.

    Ich hab mir das kurz angeschaut mit den vielen Button. Naja. Meine Vorgehensweise wäre es nicht.

    Es entspricht warscheinlich auch nicht ganz dem was genau gefragt wurde. Aber es zeigt den Umgang wie man so was handhaben kann. Ich hoffe es beruhigt die Gemüter hier.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Public Class Form1
    4. Dim idx As Int32
    5. Dim ptStart As New Point(10, 20)
    6. Dim szButton As New Size(115, 34)
    7. Dim lstLabels As New List(Of Label)
    8. Dim lstButtons As New List(Of Button)
    9. Private Sub Button_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    10. 'Für alle Buttons den gleichen Click Event
    11. If TypeOf sender Is Button Then
    12. MessageBox.Show(DirectCast(sender, Button).Name & " was clicked")
    13. End If
    14. End Sub
    15. Private Sub btnCreate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCreate.Click
    16. CreateLabelsAndButtons()
    17. End Sub
    18. Private Sub Form1_FormClosed(ByVal sender As System.Object, ByVal e As System.Windows.Forms.FormClosedEventArgs) Handles MyBase.FormClosed
    19. Me.btnDelete.PerformClick()
    20. End Sub
    21. Private Sub btnDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDelete.Click
    22. For i As Int32 = 0 To lstButtons.Count - 1
    23. With lstButtons(i)
    24. RemoveHandler .Click, AddressOf Button_Click
    25. Me.sp1.Panel1.Controls.Remove(lstButtons(i))
    26. .Dispose()
    27. End With
    28. With lstLabels(i)
    29. Me.sp1.Panel1.Controls.Remove(lstLabels(i))
    30. .Dispose()
    31. End With
    32. Next
    33. lstLabels.Clear()
    34. lstButtons.Clear()
    35. Me.idx = 0
    36. End Sub
    37. Private Function GetX(ByVal bol As Boolean) As Int32
    38. If bol Then 'True gleich Label
    39. Return If((idx And 1) = 0, ptStart.X, 270)
    40. End If
    41. Return If((Me.idx And 1) = 0, _
    42. Me.ptStart.X + Me.lstLabels(idx).Width + 15, _
    43. Me.lstLabels(idx).Location.X + Me.lstLabels(idx).Width + 15)
    44. End Function
    45. Private Function GetY(ByVal bol As Boolean) As Int32
    46. If bol Then 'True gleich Label
    47. Return ptStart.Y - Me.sp1.Panel1.VerticalScroll.Value + (idx \ 2) * 35
    48. End If
    49. Return (ptStart.Y - 6) - Me.sp1.Panel1.VerticalScroll.Value + (idx \ 2) * 35
    50. End Function
    51. Private Function CreateButton() As Button
    52. Dim btn As New Button
    53. With btn
    54. .Size = szButton
    55. .Name = "Button_" & Me.idx.ToString
    56. .Text = "Button " & Me.idx.ToString
    57. .Location = New Point(GetX(False), GetY(False))
    58. AddHandler .Click, AddressOf Button_Click
    59. End With
    60. Return btn
    61. End Function
    62. Private Function CreateLabel() As Label
    63. Dim Lb As New Label
    64. With Lb
    65. .Name = "Label_" & Me.idx.ToString
    66. .Text = "Label " & Me.idx.ToString
    67. .Location = New Point(GetX(True), GetY(True))
    68. End With
    69. Return Lb
    70. End Function
    71. Private Sub CreateLabelsAndButtons()
    72. Me.lstLabels.Add(Me.CreateLabel()) : Me.lstButtons.Add(Me.CreateButton()) : idx += 1
    73. Me.lstLabels.Add(Me.CreateLabel()) : Me.lstButtons.Add(Me.CreateButton())
    74. Me.SuspendLayout()
    75. With Me.sp1.Panel1
    76. .Controls.Add(Me.lstLabels(Me.idx))
    77. .Controls.Add(Me.lstButtons(Me.idx))
    78. .Controls.Add(Me.lstLabels(Me.idx - 1))
    79. .Controls.Add(Me.lstButtons(Me.idx - 1))
    80. End With
    81. Me.ResumeLayout(False)
    82. idx += 1
    83. End Sub
    84. Public Sub New()
    85. MyBase.New()
    86. InitializeComponent()
    87. Me.sp1.Panel1.AutoScroll = True
    88. Me.idx = 0
    89. End Sub
    90. End Class


    Freundliche Grüsse

    exc-jdbi
    Dateien

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()