Auf ein dynamisch erstelltes Objekt (Button) zugreifen (z.B. Click erkennen)

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von RedReed.

    Auf ein dynamisch erstelltes Objekt (Button) zugreifen (z.B. Click erkennen)

    Hallo liebe /VB/ freunde!

    Ich habe vor ein paar Tagen wieder mit VB angefangen (damals VB2005, nun VB2008-VB2010), und bin auf ein Problem gestoßen:

    Ich habe mehrere Forms. In der ersten Form sollen in einer Listbox 2 Arten von Einträgen getätigt werden: Abteilung und Mitarbeiter.
    Soweit kein Problem, die Abteilung wird auch mit einem Präfix "+++" in der Listbox gekennzeichnet.

    Nun werden in der darauffolgenden Form alle Abteilungen als Groupbox aufgelistet, der Itemname wird zum Groupboxname (z.B. +++ Vertrieb +++). Die Mitarbeiter werden als Buttons in diesen Groupboxen erstellt, ihnen wird je nach Listboxeintrag (z.B. Max Mustermann) das entsprechende Mitarbeiterbild als Button.backgroundimage zugewiesen.

    Nun möchte ich auf die einzellnen Mitarbeiter-Buttons klicken können, um mir in einer neuen, aufploppenden Form Details zu dem entsprechnden Mitarbeiter ansehen zu können.

    Zunächst mein Code-Teil:

    VB.NET-Quellcode

    1. Private Sub Overview_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Dim Itemname As String
    3. Dim CreatePoint As Point
    4. Dim Counter As Integer
    5. Counter = employee.lstb_employee.Items.Count - 1
    6. For I As Integer = 0 To Counter
    7. Itemname = employee.lstb_employee.Items.Item(I)
    8. If Itemname.StartsWith("+++") Then
    9. 'uninteressant für das Problem
    10. ElseIf Not Itemname.StartsWith("+++") Then
    11. Y = Y + 20
    12. X = X + 60CreatePoint = New Point(X, Y)
    13. Dim Label As New Windows.Forms.LabelDim Button As New Windows.Forms.Button
    14. Me.Controls.Add(Button)Me.Controls.Add(Label)
    15. Button.Location = New Point(CreatePoint)
    16. Button.Name = ItemnameButton.Size = New Size(50, 50)Label.Location = New Point(X, Y + 50)
    17. Label.Name = Itemname
    18. [...]
    19. If Itemname.StartsWith("Max Mustermann") ThenButton.BackgroundImage = System.Drawing.Bitmap.FromFile(My.Application.Info.DirectoryPath & "\..\..\Pictures\Employees\Max Mustermann.jpg")
    20. Label.Text = "Max" & vbCrLf & "Mustermann"
    21. ElseIf [...]
    22. Else
    23. Button.BackColor = Color.Red
    24. Label.Text = "Unknown" & vbCrLf & "Employee"
    25. End If
    26. Button.BackgroundImageLayout = ImageLayout.Zoom
    27. Button.BringToFront()
    28. Button.Show()
    29. Label.TextAlign = ContentAlignment.TopLeft
    30. Label.BringToFront()
    31. Label.Show()
    32. Y = Y - 20
    33. End If
    34. Next
    35. End Sub
    36. End Class

    Mein Problem ist nun wie folgt:
    ich brauche eine Möglichkeit, den Click auf einen Mitarbeiter-Button festzustellen.
    Die Sufu von Google gab mir den Tipp,
    das

    VB.NET-Quellcode

    1. Dim Button As New Windows.Forms.Button

    Global mit withevents zu deklarieren.
    Das erzeugt mir in der Form allerdings nur einen Button, dessen Werte nur jedes mal neu überschrieben werden (letzendlich ist nur ein Button zu sehen).

    Wie kann ich nun auf die Buttons zugreifen, bzw. "merken" das geklickt wurde? (Klassenmethode? handles button.click?)

    Bitte helft mir, ich freue mich über jede Antwort!
    Bei dynamisch erzeugten Objekten musst du AddHandler benutzen, um Events zu registrieren:

    VB.NET-Quellcode

    1. AddHandler dynBtn.Click, AddressOf dynBtn_Click

    Anhand des Arguments "sender" kannst du in der Handler-Methode auf den geklickten Button zugreifen.

    Viele Grüße, Phil.
    Hallo RedReed.

    Ich weiß zwar nicht ob dir das weiter hilft aber trotzdem:

    Dieser Code ist zwar für einen Toolstrip aber eigentlich sollte man ihn umschreiben Können.
    In dem Code klickt man auf ein erstelltes ToolStripItem und der Webbrowser Navigiert dann dort hin (Nach dem Namen):

    VB.NET-Quellcode

    1. Private Sub tsBtnFavorites_DropDownItemClicked(ByVal sender As Object, ByVal e As System.Windows.Forms.ToolStripItemClickedEventArgs) Handles tsBtnBookmarks.DropDownItemClicked
    2. Dim clicked As ToolStripItem = e.ClickedItem
    3. Dim i As String = e.ClickedItem.Name
    4. webbrowser1.Navigate(e.ClickedItem.Text, inNewWindow)
    5. End Sub


    Ich weiß nicht ob es funktioniert aber theoretisch lässt sich der Code so umschreiben:

    VB.NET-Quellcode

    1. Dim clicked As Button = e.ClickedItem
    2. Dim i As String = e.ClickedItem.Name
    3. Dim n as String = e.ClickedItem.text
    4. If Not i = "Weiter" And Not i = "Zurück" And Not i = "Löschen" _
    5. And Not i = "Neu" Then
    6. FrmMitarbeiter.show
    7. frmMitarbeiter.labelname.text = n
    8. End If


    Ich hoffe das hilft die irgendwie^^
    mfg: Gather
    Mfg: Gather
    Private Nachrichten bezüglich VB-Fragen werden Ignoriert!


    RedReed schrieb:

    Bitte helft mir, ich freue mich über jede Antwort!

    Wollemermalsehen, ob das stimmt :evil:

    Es ist prinzipiell schon möglich, so ein Gewurstel mit Listboxen, Groupboxen, Buttons etc vorzunehmen, es ist aber
    • irrsinnig aufwändig
    • unübersichtlich
    • fehleranfällig
    • benutzerfeindlich (aufploppende Dialoge)
    • unflexibel

    Guck dirmal die SampleSolution von DatasetOnly an.
    Vonne Struktur genau dasselbe wie deine Abteilungen und Mitarbeiter: ein ParentChild-View.
    Nur da plopt nix auf, da müssen keine Events ständig umgestöpselt werden, da kann man zufügen und löschen,...
    Klar, ErfinderDesRades, dafür hab ich mich hier doch angemeldet.
    Also, vielen Dank für alle Hilfen - ich habs jetzt über den Addhandler gelöst - aber ich werd mir mich nun mal schlau machen wie die DB-Programmierung aussieht :)