Eigene Sub-UserControls in einem UserControl mit For-Schleife durchlaufen um Events zu abonieren.

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

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

    Eigene Sub-UserControls in einem UserControl mit For-Schleife durchlaufen um Events zu abonieren.

    Hallo,

    ich habe ein UserControl, das ist vollgepackt mit den unterschiedlichsten SubControls. Dabei handelt es sich auch um selbst gebastelte Controls, die sowohl Windows Controls als auch eigene Funktionen enthalten. Allen SubControls ist gemeinsam, dass sie ein Event 'UserChangedControlSettings' besitzen. Dieses Event wird vom SubControl immer dann gefeuert, wenn (wie der Name schon sagt) der Anwender eine Änderung an den SubControl Settings vornimmt. Alle Controls (das beherbergende UserControl und auch die darin befindlichen SubControls) werden zur Laufzeit in ParanetForm, sind als beim Programmstart nicht bekannt.
    Geladen werden sämtliche Controls mittels einer Konfigurationsdatei über das MainForm, also nicht vom ParentForm der Controls selbst. Das MainForm lädt das ParentForm und das UserControl und die darauf befindlichen SubControls in das ParentForm. Ist dies geschehen ist das MainForm raus und es wird Form.Load des ParentForm ausgeführt. In .Load möchte ich dafür sorgen, dass das ParentForm, welches das UserControl mit seinen SubControls enthält auf das Event 'UserChangedControlSettings' reagiert.



    Im Moment mache ich das so, dass ich mit For Each..TypeOf das UserControl durchsuche. Sofern der Typ passend ist, weiße ich mittels AddHandler das 'UserChangedControlSettings' Event des jeweiligen Controls einer Funktion im ParentForm zu.

    VB.NET-Quellcode

    1. 'SubControl_1
    2. For Each ctrl As SubControl_1 In UserControl.Controls.OfType(Of SubControl_1)()
    3. AddHandler ParentForm.UserChangedControlSettings, AddressOf DoSomething
    4. Next
    5. 'SubControl_2
    6. For Each ctrl As SubControl_2 In _SubSubCtrl.Controls.OfType(Of SubControl_2)()
    7. AddHandler ParentForm.UserChangedControlSettings, AddressOf DoSomething
    8. Next
    9. 'SubControl_3
    10. For Each ctrl As SubControl_3 In _SubSubCtrl.Controls.OfType(Of SubControl_3)()
    11. AddHandler ParentForm.UserChangedControlSettings, AddressOf DoSomething
    12. Next

    Meine Frage:
    geht das nicht simpler?
    Im Grund sind alle meine SubControls ja auch UserControls. Gibt es eine Möglichkeit nicht einfach alle Controls der ParentForms zu durchsuchen.

    VB.NET-Quellcode

    1. For Each ctrl As Control In _SubSubCtrl.Controls
    2. If TypeOf ctrl Is UserControl Then
    3. AddHandler ctrl.UserChangedControlSettings, AddressOf mod_Functions_SetAsteriskInFormTitelText
    4. End If
    5. Next

    Das funktioniert nicht, da 'UserChangedControlSettings' kein Ergeignis von System.Windows.Forms.Control ist.
    Ist es irgendwie möglich herauszufinden, ob ein Control das Event 'UserChangedControlSettings' besitzt und das dann evtl. zu casten?
    Ich hatte auch an Interfaces gedacht. Aber keine Ahnung ob mir das weiter hilft.

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Stichwort Interface.
    Erstelle ein Interface mit Inhalt Dein Event und lass alle relevanten Klassen dieses implementieren. Dann kannst Du die Interface-Implementierer mit ner ggf. geschachtelten For-Each-Schleife durchgehen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    roepke schrieb:

    Allen SubControls ist gemeinsam, dass sie ein Event 'UserChangedControlSettings' besitzen.
    Das deklarierst Du über ein Interface, welches die UCs dann implementieren.
    Die UCs packst Du dann in eine List(Of DEIN_NEUES_INTERFACE), da kannst Du dann in einer Schleife machen, was immer zu tun ist.
    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!