Addhandler mehrere Objekte einbeziehen

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

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Addhandler mehrere Objekte einbeziehen

    Hallo,

    ich habe folgende Problemstellung:

    Ich habe einen Tabcontrol, welcher während der Laufzeit dynamisch Tab's hinzugefügt bekommt.
    Anschließend bekommt jedes Tag eigene Controls zugewiesen wie z.B. eine ListBox.
    Diese Listbox wird dann gefüllt. Alles soweit hinbekommen.

    Nun möchte ich Ereignisse hervorrufen durch Events, habe bisher mit Addhandler gearbeitet.
    Funktioniert vom Prinzip her so wie ich es mir vorgestellt habe nur folgendes:

    Sobald ich ein Item im dynamisch Generierten Listbox anklicke soll er die anderen ebenfalls
    dynamisch hinzugefügten Controls anzeigen lassen (visible = true). Nur kann ich darauf nicht
    zugreifen da sie nicht Global deklariert sind. Kann ich die anderen Objekte/Controls irgendwie
    über das gleiche Addhandler mitsenden, sodass ich beim Sub darauf zugreifen kann?

    Code:

    VB.NET-Quellcode

    1. Private Sub Daten_Laden()
    2. For Each Page As TabPage In TabControl1.TabPages
    3. Dim Tabelle As New ListBox
    4. Dim PBox As New PictureBox
    5. Dim DB As New Button
    6. ...
    7. AddHandler Tabelle.SelectedIndexChanged, AddressOf ItemAuswahl
    8. Next
    9. End Sub
    10. (...)
    11. Private Sub ItemAuswahl(sender As System.Object, e As System.EventArgs)
    12. Dim Tabelle As ListBox
    13. Tabelle = CType(sender, ListBox)
    14. 'Hier würde ich gerne DB oder PBox.visible = true stellen
    15. End Sub


    Gruß
    Hochachtungsvoll
    MindFreak

    MiNdFrReAk schrieb:

    Kann ich die anderen Objekte/Controls irgendwie über das gleiche Addhandler mitsenden
    Verwende Deine eigenen Events und Deine eigenen EventArgs, da kannst Du reinpacken, was immer Du brauchst:

    VB.NET-Quellcode

    1. Public Class MyEventArgs
    2. Inherits EventArgs
    3. Public Property a1 As WasAuchImmer
    4. Public Property a2 As WasAuchImmer
    5. Public Property a3 As WasAuchImmer
    6. Public Property a4 As WasAuchImmer
    7. End Class

    VB.NET-Quellcode

    1. Private Sub ItemAuswahl(sender As System.Object, e As MyEventArgs)
    2. 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!
    Achtung: ich vertrete hier mal 2 Ansätze gleichzeitig
    1)

    MiNdFrReAk schrieb:

    Ich habe einen Tabcontrol, welcher während der Laufzeit dynamisch Tab's hinzugefügt bekommt. Anschließend bekommt jedes Tag eigene Controls zugewiesen wie z.B. eine ListBox. Diese Listbox wird dann gefüllt.
    Dynamisch Controls zufügen ist immer problematisch, weil wird immer komplizierter und komplizierter
    Alles soweit hinbekommen.
    ja, aber nun stehste da an einem Punkt...
    Wobei man bei TabControls eine Ausnahme machen kann, nämlich, dass man deren Tabs u.U. doch dynamisch erzeugt, dann aber auf jedem Tab nur ein einziges UserControl aufbringt - in dem dann die komplexere Logik untergebracht ist. So weiß man immer, was auf welchem Tab ist, und wie es ansprechen.
    Im UserControl kannst du auch die von Rod vorgeschlagenen eigenen Events definieren, die dann UserControl-spezifische Daten versenden.



    2)
    Sobald ich ein Item im dynamisch Generierten Listbox anklicke soll er die anderen ebenfalls dynamisch hinzugefügten Controls anzeigen lassen (visible = true). Nur kann ich darauf nicht
    zugreifen da sie nicht Global deklariert sind.
    Global ist der falsche Begriff. Die Controls müssen Klassenweit verfügbar sein.
    Und das sind sie nicht, aber du kannst doch dafür sorgen: Deklariere klassenweit eine List(Of Control) (oder Listbox, oder whatever), und wenn du son Control auf ein Tab packst, dann tus ausserdem in die og. Liste, damit es klassenweit verfügbar ist.



    Ich aber favorisiere Ansatz 1) - wie gesagt: dynamisch Controls erzeugen ist immer ein jehnseitsmäßiges Heckmeck, und fast immer, wenn man näher hinguckt, finden sich wesentlich elegantere Lösungen.

    ach - noch ein 3. Ansatz:
    Meist ergibt sich das Bestreben, dynamisch Controls zu erzeugen nämlich aus einer verfehlten Architektur, bei der Daten und Gui nicht getrennt sind. Solch vermute ich auch hier, nämlich dass du in wirklichkeit Datensätze anzeigen willst, und nu generierste für jeden Datensatz ein Tab (und Probleme werden erst richtig lustig, wenn du Datensätze löschen und zufügen möchtest ;)).
    Anstelle der vielen Tabs könntest du dich auch auf Databinding stürzen, und etwa einen DetailView anlegen - der sieht anners aus, bringt aber funktional dasselbe (und mehr!) wie ein TabControl.

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