Event aus einer Klasse, deren Objekte sich in einer List befinden

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von sonne75.

    Event aus einer Klasse, deren Objekte sich in einer List befinden

    Hallo,

    ich habe in meiner Form eine List(Of Channel) und aus dieser Channel-Klasse will ich Event hochschicken. Aus dem Sender ist ja dann klar, welcher das ist, da brauche ich dann nur die Eigenschaften.

    VB.NET-Quellcode

    1. Public lstChannel As New List(Of Channel)
    2. Form_Load:
    3. For i=0 To 31
    4. lstChannel.Add(New Channel(...))
    5. Next
    6. Private Sub HandleChannelEvent(ByVal sender As object, e as EventArgs)
    7. ' hier drin will ich die Events alle behandeln
    8. End Sub
    Ich habe das mal in etwa so gelöst:

    VB.NET-Quellcode

    1. ListOfObject.ForEach(Sub(x) AddHandler x.MyEvent, AddressOf MyEventHandler)

    Der WithEvents-Spezifizierer funktioniert meiner Erfahrung nach da nicht.

    EDIT: In deinem Fall wäre es dann:

    VB.NET-Quellcode

    1. lstChannel.ForEach(Sub(x) AddHandler x.[Hier das Event], AddressOf HandleChannelEvent)
    @sonne75:: Warum muss jedes Objekt seinen eigenen Eventhandler haben?
    Mach den zentral und unterscheide dann anhand Sender und EventArg, was 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!

    sonne75 schrieb:

    (sind ja nur 3
    Da würde ich erst recht über einen Event-Verteiler nachdenken.
    Gib ihnen Deine eigenen EventArgs mit, da kannst Du alles mit organisieren.
    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!

    sonne75 schrieb:

    mitgeben
    So:

    VB.NET-Quellcode

    1. Public Class MyEventArgs
    2. Inherits EventArgs
    3. ' alles reinpacken
    4. 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!

    RodFromGermany schrieb:

    Warum muss jedes Objekt seinen eigenen Eventhandler haben?
    Mach den zentral und unterscheide dann anhand Sender und EventArg, was zu tun ist.

    sonne75 schrieb:

    EventArgs gebe ich schon mit, ich muss was übergeben. Ich werde schauen, ob die Funktionalität auch gleich ist, wenn, dann muss ich in EventArgs nur den Type (als String?) mitgeben, um zu wissen, in was ich sender casten muss.

    Das ist jetzt Design-Frage.
    Allgemein unschön ist, alles in einen Handler zu stopfen, innerhalb dessen dann wieder auseinanderklamüsert werden muss, womöglich noch anhand weiterer EventArgs-Member, die extra deswegen neue Komplexität hineinbringen.
    Da ist die logisch einfacherere Lösung, gleich an 3 verschiedene Handler zu verteilen, und jeder Handler weiß von vornherein, was zu tun ist.

    Design-Prinzip: Gleiches zusammenschmeißen, unterschiedliches aber nicht.
    Ja, so wollte ich auch machen, wenn Funktionalität gleich ist, dann geht es mir nur um den Typ zum Casten, damit ich weiß, welcher Sender das ist. Aber ich werde es sehen, ich bekam jetzt sowieso noch einige Anforderungen an das Programm, welche einiges umschmeißen. ;( Wie immer halt in der freien Wirtschaft... Während der Entwicklung ändern oder ergänzen sich ständig die Anforderungen.
    Warum zweimal durch die Liste durch, wenn mans auch direkt setzen kann? :)

    VB.NET-Quellcode

    1. Public lstChannel As New List(Of Channel)
    2. Form_Load:
    3. For i=0 To 31
    4. Dim tmp as New Channel(...)
    5. AddHandler tmp.DeinEvent, AddressOf HandleChannelEvent
    6. lstChannel.Add(tmp)
    7. Next
    8. Private Sub HandleChannelEvent(ByVal sender As object, e as EventArgs)
    9. ' hier drin will ich die Events alle behandeln
    10. End Sub


    Für verschiedene Handler:

    VB.NET-Quellcode

    1. Public lstChannel As New List(Of Channel)
    2. Sub Form_Load()
    3. For i=0 To 31
    4. Dim tmp as New Channel(...)
    5. 'Insert comlicated checkroutine here
    6. If i Mod 2 = 0 then
    7. AddHandler tmp.DeinEvent, AddressOf HandleChannelEvent
    8. Else
    9. AddHandler tmp.DeinEvent, AddressOf HandleChannelEvent2
    10. End If
    11. lstChannel.Add(tmp)
    12. Next
    13. End Sub
    14. Private Sub HandleChannelEvent(ByVal sender As object, e as EventArgs)
    15. ' hier drin will ich die Events alle behandeln
    16. End Sub
    17. Private Sub HandleChannelEvent2(ByVal sender As object, e as EventArgs)
    18. ' hier drin will ich die Events alle behandeln
    19. End Sub


    LG
    SWYgeW91IGNhbiByZWFkIHRoaXMsIHlvdSdyZSBhIGdlZWsgOkQ=

    Weil einfach, einfach zu einfach ist! :D