Remove Handler

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

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von SidezockingLP.

    Remove Handler

    Hey zusammen :)
    Habe mal wieder eine Frage bei der ich einfach nicht weiterkomme und auch beim suchen im Internet nichts gefunden habe.

    Also so erstellt man Handler und löscht sie wieder:

    VB.NET-Quellcode

    1. AddHandler Button.Click, AddressOf Mach_irgendwas
    2. RemoveHandler Button.Click, AddressOf Mach_irgendwas


    Aber wie lösche ich so einen erstellten Handler: ?

    VB.NET-Quellcode

    1. AddHandler Button.Click, Sub() Mach_irgendwas(mit_dem_Wert)
    2. RemoveHandler Button.Click, Sub() Mach_irgendwas(mit_dem_Wert)


    Was auch schon helfen würde, wie löscht man denn alle Handler eines Controls oder geht das nicht?

    Hoffe ihr könnt mir helfen :)
    Hi
    du musst den Lambda-Ausdruck zwischenspeichern, damit du ihn wieder entfernen kannst. Die Zahl der Parameter wird außerdem zwar von VB.Net angepasst, aber eigentlich sollte dein Sub() zwei Parameter haben.

    VB.NET-Quellcode

    1. Private _handler As EventHandler

    VB.NET-Quellcode

    1. _handler = Sub(sender, e) Mach_irgendwas(mit_dem_Wert)
    2. AddHandler Button.Click, _handler
    3. RemoveHandler Button.Click, _handler


    Soweit ich weiß, unterstützen die durch Lambdaausdrücke erzeugten Klassen keine solche Äquivalenz-Definition, dass du den von dir gezeigten Code darauf ausführen könntest.

    Viele Grüße
    ~blaze~
    Die Kurzfassung ist diese:

    Das:

    VB.NET-Quellcode

    1. Sub Test()
    2. Dim Handler = Sub(sender As Object, e As EventArgs) MachIrgendwas()
    3. AddHandler Button.Click, Handler
    4. RemoveHandler Button.Click, Handler
    5. End Sub
    kompiliert zu:

    VB.NET-Quellcode

    1. Delegate Sub AnonymousDelegate1(sender As Object, e As EventArgs)
    2. Sub AnonymousMethod1(sender As Object, e As EventArgs)
    3. MachIrgendwas()
    4. End Sub
    5. Sub Test()
    6. Dim Handler = New AnonymousDelegate1(AddressOf AnonymousMethod1)
    7. AddHandler Button.Click, Handler
    8. RemoveHandler Button.Click, Handler
    9. End Sub
    Hier ist Handler bei AddHandler und RemoveHandler das gleiche.

    Aber:

    VB.NET-Quellcode

    1. Sub Test()
    2. AddHandler Button.Click, Sub(sender As Object, e As EventArgs) MachIrgendwas()
    3. RemoveHandler Button.Click, Sub(sender As Object, e As EventArgs) MachIrgendwas()
    4. End Sub
    kompiliert jedoch zu:

    VB.NET-Quellcode

    1. Delegate Sub AnonymousDelegate1(sender As Object, e As EventArgs)
    2. Sub AnonymousMethod1(sender As Object, e As EventArgs)
    3. MachIrgendwas()
    4. End Sub
    5. Delegate Sub AnonymousDelegate2(sender As Object, e As EventArgs)
    6. Sub AnonymousMethod2(sender As Object, e As EventArgs)
    7. MachIrgendwas()
    8. End Sub
    9. Sub Test()
    10. AddHandler Button.Click, New AnonymousDelegate1(AddressOf AnonymousMethod1)
    11. RemoveHandler Button.Click, New AnonymousDelegate2(AddressOf AnonymousMethod2)
    12. End Sub
    Obwohl in den beiden Lambdas der exakt gleiche Code drin steht, werden zwei separate Methoden kompiliert (dafür gibt's Gründe, kann ich bei Bedarf gerne erklären). Dadurch wird bei RemoveHandler versucht, etwas zu entfernen, was nie hinzugefügt wurde.

    Die Langfassung behandelt intensiv Delegaten, Eventhandling und Compiler-generierten Code in VB.
    Beim Recherchieren für diese Antwort hier habe ich etwas herausgefunden, was für mich sehr überraschend war. Deshalb wollte ich ursprünglich auch genauer erklären, was im Hintergrund passiert, wenn man AddHandler Foo, AddressOf Bar und AddHandler Foo, Sub() Baz() hinschreibt, dann weiter ausführen und an Beispielen erklären, warum RemoveHandler mit manchen Fällen funktioniert und mit anderen nicht und schlussendlich erklären, was mich so überrascht hat. Aber beim Schreiben habe ich dann das Gefühl bekommen, dass das eigentlich eh total logisch ist und es mich zu unrecht überrascht hat. Und es hat sich relativ schnell herausgestellt, dass man die Situation, wenn man ein paar Details ignoriert, auch ganz einfach erklären kann (siehe Kurzfassung).
    Wenn Du die Details, die ich ausgelassen habe, erklärt haben möchtest, und bereit bist, meinen Roman zu lesen, dann schreib ich Dir das gerne zusammen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils