Event weiterleiten an andere Klasse

  • VB.NET

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

    Event weiterleiten an andere Klasse

    Hallo zusammen,

    kurze Frage, ich möchte das meine Document Events auch in der Application verfügbar sind. Gibt es eine andere Möglichkeit als meine Lösung, finde ich nicht so schön, dass ich die Events zwei mal deklarieren muss.


    VB.NET-Quellcode

    1. Public Class EQ_Document
    2. Public Property FullFileName As String = ""
    3. End Class
    4. Public Class EQ_Documents
    5. Inherits System.Collections.ObjectModel.KeyedCollection(Of String, EQ_Document)
    6. Public Event OnDocumentClose(BeforeOrAfter As EventTimingEnum)
    7. Public Event OnDocumentOpen(BeforeOrAfter As EventTimingEnum, ByRef Document As EQ_Document)
    8. Protected Overrides Function GetKeyForItem(item As EQ_Document) As String
    9. Return item.FullFilename
    10. End Function
    11. Protected Overrides Sub InsertItem(index As Integer, item As EQ_Document)
    12. RaiseEvent OnDocumentOpen(EventTimingEnum.After, item)
    13. MyBase.InsertItem(index, item)
    14. RaiseEvent OnDocumentOpen(EventTimingEnum.After, item)
    15. End Sub
    16. Protected Overrides Sub RemoveItem(index As Integer)
    17. RaiseEvent OnDocumentClose(EventTimingEnum.Before)
    18. MyBase.RemoveItem(index)
    19. RaiseEvent OnDocumentClose(EventTimingEnum.After)
    20. End Sub
    21. End Class
    22. Public Class EQ_Application
    23. Public Event OnDocumentClose(BeforeOrAfter As EventTimingEnum)
    24. Public Event OnDocumentOpen(BeforeOrAfter As EventTimingEnum, ByRef Document As EQ_Document)
    25. Private WithEvents Documents As New EQ_Documents
    26. Private Sub Documents_OnDocumentClose(BeforeOrAfter As EventTimingEnum) Handles Documents.OnDocumentClose
    27. RaiseEvent OnDocumentClose(BeforeOrAfter)
    28. End Sub
    29. Private Sub Documents_OnDocumentOpen(BeforeOrAfter As EventTimingEnum, ByRef Document As EQ_Document) Handles Documents.OnDocumentOpen
    30. RaiseEvent OnDocumentOpen(BeforeOrAfter, Document)
    31. End Sub
    32. End Class
    "Es ist absolut möglich, dass jenseits der Wahrnehmung unserer Sinne ungeahnte Welten verborgen sind." — Albert Einstein
    "Wenn die Macht der Liebe die Liebe zur Macht übersteigt, erst dann wird die Welt endlich wissen, was Frieden heißt." — Jimi Hendrix

    FredM schrieb:

    finde ich nicht so schön, dass ich die Events zwei mal deklarieren muss.
    Doch, die musst Du fein säuberlich durchreichen.
    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!
    @RodFromGermany

    ich hab mich auch erst verlesen, kann es sein das er nur die Events die beide Klassen enthalten nicht zweimal deklarieren will?

    VB.NET-Quellcode

    1. Public Class Foo
    2. Inherits MyClassBase
    3. Public Function Bar() As Boolean
    4. Return Foo()
    5. End Function
    6. End Class
    7. Public MustInherit Class MyClassBase
    8. Public Function Foo() As Boolean
    9. Return True
    10. End Function
    11. End Class


    ich dachte da an soetwas.
    Normalerweise erstellt man in der Basisklasse ein Event.
    Zusätzlich wird eine überschreibbare Methode mit OnEventname erstellt welche ein RaiseEvent auf das erstelle Event ausführt.

    Bsp.:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents cls As New Bar
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. AddHandler cls.Hallo, AddressOf Hallo
    5. cls.Test = "Hallo"
    6. End Sub
    7. Private Sub Hallo(ByVal sender As Object, ByVal e As EventArgs)
    8. MessageBox.Show("Hallo")
    9. End Sub
    10. End Class
    11. Public Class Foo
    12. Public Event Hallo As EventHandler(Of EventArgs)
    13. Private _test As String
    14. Public Property Test() As String
    15. Get
    16. Return _test
    17. End Get
    18. Set(ByVal value As String)
    19. _test = value
    20. OnHallo(Me, New EventArgs)
    21. End Set
    22. End Property
    23. Protected Overridable Sub OnHallo(ByVal sender As Object, ByVal e As EventArgs)
    24. RaiseEvent Hallo(sender, e)
    25. End Sub
    26. End Class
    27. Public Class Bar : Inherits Foo
    28. Protected Overrides Sub OnHallo(ByVal sender As Object, ByVal e As System.EventArgs)
    29. MyBase.OnHallo(sender, e)
    30. End Sub
    31. End Class


    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    @ident: ich dachte an so was:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private WithEvents tt1 As New test1
    3. Public Sub xxx() Handles tt1.EventTest1
    4. MessageBox.Show("durchgereichter Event")
    5. End Sub
    6. End Class
    7. Public Class test1
    8. Public Event EventTest1()
    9. Private WithEvents tt2 As New test2
    10. Public Sub xxx() Handles tt2.EventTest2
    11. RaiseEvent EventTest1()
    12. End Sub
    13. End Class
    14. Public Class test2
    15. Public Event EventTest2()
    16. Public Sub xxx()
    17. RaiseEvent EventTest2()
    18. End Sub
    19. 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!