UserControl mit eigenem Event aus eigener DLL in MainForm einbinden

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

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

    UserControl mit eigenem Event aus eigener DLL in MainForm einbinden

    Hallo,
    ich habe eine DLL voll mit eigenen Controls erstellt
    Eines davon erzeugt bei Bedarf ein Event:

    VB.NET-Quellcode

    1. Public Class MyOwnControl
    2. Public Event UserChangedControlSettings(bShowIt As Boolean)
    3. RaiseEvent UserChangedControlSettings(bShowIt)
    4. End Class


    Das funktioniert auch.
    Ich habe das Control nun mehrfach in einem Projekt mit TabControl eingebunden und möchte dort das Event für jede Controlinstanz abonnieren.
    Dazu durchsuche ich das TabControl TapPage-Weise und versuche MyOwnControl zu finden um dann die Adresse der Funktion zuzuweisen die im Eventfall angesprungen werden soll:

    VB.NET-Quellcode

    1. For Each tp As TabPage In TabControl.TabPages
    2. For Each ctrl As Control In tp.Controls
    3. For Each moctrl As MyOwnControl In tp.Controls.OfType(Of MyOwnControl)()
    4. If TypeOf moctrl Is MyOwnControl Then
    5. AddHandler moctrl.UserChangedControlSettings, AddressOf ReactOnUserChangedControlSettings
    6. End If
    7. Next
    8. Next
    9. Next


    Leider wird

    VB.NET-Quellcode

    1. For Each moctrl As MyOwnControl In tp.Controls.OfType(Of MyOwnControl)()
    2. ...
    3. Next


    übersprungen.

    Ein:

    VB.NET-Quellcode

    1. If TypeOf ctrl Is ACU_Controls.MuxControl Then
    2. AddHandler ctrl.UserChangedControlSettings, AddressOf ReactOnUserChangedControlSettings
    3. End If


    anstelle der

    VB.NET-Quellcode

    1. For Each moctrl As ...


    funktioniert auch nicht, da ja "UserChangedControlSettings" kein Ereignis von System.Windows.Forms.Control ist.

    Hat jeamand eine Idee wie ich eigene Controls mit eignen Ereignissen einer DLL in einem Projekt "loopen" und deren Eriegnisse abonieren kann?

    VB.NET-Quellcode

    1. For Each tp As TabPage In TabControl.TabPages
    2. For Each ctrl As Control In tp.Controls
    3. For Each moctrl As MyOwnControl In tp.Controls.OfType(Of MyOwnControl)()
    4. If TypeOf moctrl Is MyOwnControl Then
    5. AddHandler moctrl.UserChangedControlSettings, AddressOf ReactOnUserChangedControlSettings
    6. End If
    7. Next
    8. Next
    9. Next

    Die Zeilen#2 und #8 sind überflüssig, daran zu sehen, dass Du ctrl nirgends weiterverwendest.
    Sind Deine CEs direkt auf der TabPage oder in nem Container, der auf der TabPage ist? Ersteres klappt bei mir. Bei letzterem geht das nicht, da bist Du mit Deiner Schleife noch nicht auf der richtigen Ebene angekommen.
    Warum abonnierst Du die CE-Events nicht direkt? Werden die CEs von anderer Stelle aus instanziiert, die Du nicht beeinflussen kannst?
    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 Funktioniert auf Anhieb.
    Das If in Deiner innersten Schleife kannst Du rausnehmen:

    VB.NET-Quellcode

    1. Imports ClassLibrary1
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. For Each tp As TabPage In TabControl1.TabPages
    5. For Each ctrl As Control In tp.Controls
    6. For Each moctrl As MyOwnControl In tp.Controls.OfType(Of MyOwnControl)()
    7. AddHandler moctrl.UserChangedControlSettings, AddressOf ReactOnUserChangedControlSettings
    8. Next
    9. Next
    10. Next
    11. End Sub
    12. Private Sub ReactOnUserChangedControlSettings(result As Boolean)
    13. Label1.Text = result.ToString
    14. End Sub
    15. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    16. Label1.Text = ""
    17. End Sub
    18. 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).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank für die schnellen Antworten.
    @VaporiZed, du hast recht, die Zeilen #2 und #8 sind überflüssig.
    Aber genau da lag auch mein Problem.
    Auf dem 'TabControl' befindet sich ein UserControl (nennen wir es 'MyUserControl') und dieses UserControl beinhaltet die 'MyOwnControl' Instanzen.
    D.h. ich muss zunächst 'TabControl' finden, darin 'MyUserControl' und erst darin 'MyOwnControl'.

    VB.NET-Quellcode

    1. For Each tp As TabPage In TabControl.TabPages
    2. For Each ctrl As Control In tp.Controls
    3. If TypeOf ctrl Is MyUserControl Then
    4. For Each moctrl As MyOwnControl In ctrl.Controls.OfType(Of MyOwnControl)()
    5. AddHandler moctrl.UserChangedControlSettings, AddressOf ReactOnUserChangedControlSettings
    6. Next
    7. End If
    8. Next
    9. Next


    @RodFromGermany: richtig, die innnere If-Abfrage ist überflüssig.
    Keine Ahnung warum ich mich gestern diesbezüglich im Kreis gedreht habe, weil eigentlich ist es einfach zu überblicken.
    Mag sein, dass ich deshalb vor lauter-lauter die 'MyOwnControl' in TabPage (tp) und nicht in 'MyUserControl ' (ctrl) gesucht habe.
    Heute, frisch ausgeschlafen, funktioniert es nämlich auch bei mir.
    Einen hab ich noch...

    Wenn ich nun mehrere ‚MyOwnControl‘ unterschiedlichen Typs (z.B. MyOwnControl_TypeA, MyOwnControl_TypeB… usw.) innerhalb der DLL habe, gibt es einen eleganten Weg im Sinne von

    VB.NET-Quellcode

    1. For Each moctrl As Control In Me.Controls
    2. Next


    diese als

    VB.NET-Quellcode

    1. For Each moctrl As MyOwnControlDLL In Me.ControlsOfMyOWnControlDLL
    2. If TypeOf moctrl Is MyOwnControl_TypeA Then
    3. ...
    4. ElseIf TypeOf moctrl Is MyOwnControl_TypeB Then
    5. ...
    6. ElseIf TypeOf moctrl Is MyOwnControl_TypeC Then
    7. ...
    8. End If
    9. Next


    zu durchsuchen?

    Oder muss ich für jeden einzelnen Type

    VB.NET-Quellcode

    1. For Each moctrl As MyOwnControl In ctrl.Controls.OfType(Of MyOwnControl)()
    2. ...
    3. Next


    anwenden?
    @roepke Es geht beides.
    Überdenke die Möglichkeit für all diese Controls eine gemeinsame Basisklasse oder ein gemeinsames Interface zu verwenden.
    Dieses Interface kann leer sein, es dient nur der Erkennung.
    Und dann so was (ungetestet):

    VB.NET-Quellcode

    1. For Each moctrl As DAS_GEMEINSAME_ELEMENT In Me.ControlsOfMyOWnControlDLL
    Hier musst Du einfach mal spielen, setz nen Haltepunkt drauf und sieh Dir an, was die IDE Dir bei Mouse.HOver bei moctrl da anzeigt.
    Debuggen, Fehler finden und beseitigen
    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!