Benötige Hilfe beim Ansprechen von Buttons

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RushDen.

    Benötige Hilfe beim Ansprechen von Buttons

    Hallo Liebe Community,

    ich habe ein Frame erstellt, in der man per Knopfdruck einen Button erstellen kann. Dieser wird zum Schluss in ein tablelayoutpanel abgelegt.

    Ich möchte nun ein Effekt hinzufügen, dass wenn man mit der Maus über den neu erstellten Button hovert, dieser dann groß wird.
    Meine Problematik ist nun, dass ich nicht weiß wie ich den neu erstellten Button ansprechen soll, da dieser in meinem Code noch nicht existiert.

    Hoffe, dass man verstehen kann was ich meine.
    Hier noch mein Code zur Buttonerstellung:

    VB.NET-Quellcode

    1. Public Class ButtonCreator
    2. Public btnAnz As Integer = 0
    3. Public Sub createButton(btnName)
    4. Dim newb As New Button
    5. Dim NewLbl As New Label
    6. With newb
    7. .Text = ""
    8. .Size = New Size(90, 90)
    9. If frmMain2.OpenFileDialog1.ShowDialog() = DialogResult.OK Then
    10. .BackgroundImage = Image.FromFile(frmMain2.OpenFileDialog1.FileName)
    11. Else
    12. .BackgroundImage = My.Resources.Media_Button2
    13. End If
    14. .BackgroundImageLayout = ImageLayout.Stretch
    15. '.Location = New Point((frmMain1.Width - newb.Width) / 3, (frmMain1.Height - newb.Height) / 2)
    16. '.Location = New Point((frmMain1.Width - newb.Width) / 3 + (newb.Width + 15) * btnAnz, (frmMain1.Height - newb.Height) / 2)
    17. .FlatStyle = FlatStyle.Flat
    18. .FlatAppearance.BorderSize = 0
    19. .FlatAppearance.MouseDownBackColor = Color.Transparent
    20. .FlatAppearance.MouseOverBackColor = Color.Transparent
    21. End With
    22. With NewLbl
    23. .Text = btnName
    24. .Location = New Point((newb.Location.X), (newb.Location.Y + 95))
    25. .Name = "lbl" & NewLbl.Text
    26. End With
    27. newb.Name = "btn" & btnName
    28. frmMain2.TableLayoutPanel1.Controls.Add(newb)
    29. btnAnz += 1
    30. End Sub
    31. End Class


    Es sind ein paar Sachen noch ausgeklammert, die ich später einbauen will.

    Eych schrieb:

    einen Button erstellen kann.
    Wozu brauchst Du das?
    Warum machst Du das nicht im Designer?
    Bist Du bereit für solch eine Aufgabe? (sorry, das glaube ich nicht)
    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!
    Damit ist gemeint, dass Buttons normalerweise vorher schon bestehen sollten, anstatt erst zur Laufzeit generiert zu werden. Immerhin haben sie eine Funktion, die sowieso schon im Quellcode definiert ist, also kann man sie auf die Form ziehen und dann Visible auf false setzen. Wenn sie dann irgendwann erscheinen müssen setzt man Visible eben wieder auf true.

    Und anstatt einer Sub, die den Button (und Label) erstellt, konfiguriert, und auf das panel legt, solltest du daraus eine Function erstellen, die dir einen Button erstellt, konfiguriert, und dann ausgibt. Damit kannst du dann nicht nur Buttons auf andere Panels legen, sondern noch nach der Erstellung und vor dem .Add Konfigurieren. Ein Aufruf in einem Event wäre das beste Beispiel. Eine Checkbox ändert ihren Wert, und im CheckedChanged-Event fügst du dann einen Button hinzu, der was auch immer für eine Aufgabe hat. Das darfste dann über einen AddHandler? erledigen. Und da wären wir wieder bei Punkt 1. Damit der Button irgendetwas tut, muss seine Funktion schon im Quellcode stehen. Also => Buttons lieber verstecken als dynamisch generieren.

    RodFromGermany schrieb:

    Eych schrieb:

    einen Button erstellen kann.
    Wozu brauchst Du das?
    Warum machst Du das nicht im Designer?
    Bist Du bereit für solch eine Aufgabe? (sorry, das glaube ich nicht)


    Zu 1.: Ich brauche das, da der User zu der Form eigene Buttons hinzufügen soll, die diverse Aufgaben erledigen.
    Zu 2.: Wie bereits erwähnt, erstellt der User die Buttons.
    Zu 3.: Das wird sich wohl noch herausstellen...

    EaranMaleasi schrieb:

    Und da wären wir wieder bei Punkt 1. Damit der Button irgendetwas tut, muss seine Funktion schon im Quellcode stehen. Also => Buttons lieber verstecken als dynamisch generieren.


    Das Problem daran ist, dass seine Funktion auch vom User definiert wird, deswegen hielt ich es für sinnvoller dynamisch Buttons zu erstellen.

    Eych schrieb:

    deswegen hielt ich es für sinnvoller
    Poste bitte mal eine präzise Aufgabenstellung.
    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!
    Hallo,

    du machst deine Sub zu einer Function ( googlen hilft ;) ),
    dann fügst du am Ende deiner Funktion ein Return newb ein.
    Dann kannst du den Handler (also die Sub, die aufgerufen werden soll, wenn der Button geklickt wird) so hinzufügen:

    VB.NET-Quellcode

    1. Dim button As Button = createButton("ButtonName")
    2. ' So hängst du deine Funktion an das Click-Event:
    3. AddHandler button.Click, AddressOf DeineSub
    4. ' Deine Sub würde wahrscheinlich dann so ausschauen:
    5. Public Sub DeineSub(ByVal sender As Object, ByVal e As EventArgs)
    6. ' Da kommt deine Funktion rein ;)
    7. End Sub


    Hoffe, ich konnte dir helfen.
    Wenn du Probleme hast, einfach fragen :D

    ~ Alex-Digital :D
    ~ Alex-Digital :D

    if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D

    Alex-Digital schrieb:

    Hallo,

    du machst deine Sub zu einer Function ( googlen hilft ;) ),
    dann fügst du am Ende deiner Funktion ein Return newb ein.
    Dann kannst du den Handler (also die Sub, die aufgerufen werden soll, wenn der Button geklickt wird) so hinzufügen:

    VB.NET-Quellcode

    1. Dim button As Button = createButton("ButtonName")
    2. ' So hängst du deine Funktion an das Click-Event:
    3. AddHandler button.Click, AddressOf DeineSub
    4. ' Deine Sub würde wahrscheinlich dann so ausschauen:
    5. Public Sub DeineSub(ByVal sender As Object, ByVal e As EventArgs)
    6. ' Da kommt deine Funktion rein ;)
    7. End Sub


    Hoffe, ich konnte dir helfen.
    Wenn du Probleme hast, einfach fragen :D

    ~ Alex-Digital :D


    Hallo Alex,

    vielen Dank schonmal für deine Hilfe, ich habe mich wohl während du deine Beitrag verfasst hast bei google umgeschaut und bin zu dieser Lösung gekommen, die nun das tut, was ich will. Ich habe das ganze als Sub gelassen. Vielleicht hast du ja dazu Verbesserungsvorschläge aber an sich funktioniert alles.

    VB.NET-Quellcode

    1. Private Sub AnyBtn_MouseEnter(sender As Object, e As EventArgs)
    2. sender.size = New Size(98, 98)
    3. End Sub
    4. Private Sub AnyBtn_MouseLeave(sender As Object, e As EventArgs)
    5. sender.size = New Size(90, 90)
    6. End Sub
    7. Public Sub createButton(btnName)
    8. Dim newb As New Button
    9. Dim NewLbl As New Label
    10. With newb
    11. .Text = ""
    12. .Size = New Size(90, 90)
    13. If frmMain2.OpenFileDialog1.ShowDialog() = DialogResult.OK Then
    14. .BackgroundImage = Image.FromFile(frmMain2.OpenFileDialog1.FileName)
    15. Else
    16. .BackgroundImage = My.Resources.Media_Button2
    17. End If
    18. .BackgroundImageLayout = ImageLayout.Stretch
    19. '.Location = New Point((frmMain1.Width - newb.Width) / 3, (frmMain1.Height - newb.Height) / 2)
    20. '.Location = New Point((frmMain1.Width - newb.Width) / 3 + (newb.Width + 15) * btnAnz, (frmMain1.Height - newb.Height) / 2)
    21. .FlatStyle = FlatStyle.Flat
    22. .FlatAppearance.BorderSize = 0
    23. .FlatAppearance.MouseDownBackColor = Color.Transparent
    24. .FlatAppearance.MouseOverBackColor = Color.Transparent
    25. End With
    26. With NewLbl
    27. .Text = btnName
    28. .Location = New Point((newb.Location.X), (newb.Location.Y + 95))
    29. .Name = "lbl" & NewLbl.Text
    30. End With
    31. newb.Name = "btn" & btnName
    32. 'frmMain2.TableLayoutPanel1.Controls.Add(NewLbl)
    33. AddHandler newb.MouseEnter, AddressOf AnyBtn_MouseEnter
    34. AddHandler newb.MouseLeave, AddressOf AnyBtn_MouseLeave
    35. frmMain2.TableLayoutPanel1.Controls.Add(newb)
    36. btnAnz += 1
    37. End Sub

    Eych schrieb:

    aber an sich funktioniert alles.
    Es freut mich, dass Du keine Probleme meht hast.
    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!