Het gebeurtenismodel in Visual Basic maakt het mogelijk om te reageren op gebruikersacties via gebeurtenishandlers die aan controles zijn gekoppeld. Dit is cruciaal voor programma's met een GUI (grafische gebruikersinterface), waar elk element zijn eigen gebeurtenissen kan genereren.
In klassiek VB6 werd gebeurtenisverwerking uitgevoerd met een statische koppeling van controle — methode. In VB.NET en WinForms is het model flexibeler geworden: nu kan één gebeurtenis aan meerdere gebeurtenishandlers worden gekoppeld, en dynamische koppeling via AddHandler/RemoveHandler wordt ondersteund.
Een typische moeilijkheid is het dynamisch toevoegen van controles en het beheren van hun gebeurtenissen. Als je je niet afmeldt van gebeurtenissen of een handler verkeerd koppelt, kunnen er geheugolekken, dubbele aanroepen of verlies van controle over het UI-gedrag ontstaan.
Bij het dynamisch creëren van controles, gebruik AddHandler voor inschrijving en RemoveHandler voor het correct verwijderen van de handler. Let op de levensduur van controles — als een controle wordt vernietigd, moeten handlers worden afgemeld, anders blijven "hangende" verwijzingen bestaan.
Voorbeeldcode:
Dim btn As New Button() AddHandler btn.Click, AddressOf ButtonClickHandler ' ... RemoveHandler btn.Click, AddressOf ButtonClickHandler Sub ButtonClickHandler(sender As Object, e As EventArgs) MessageBox.Show("Knop ingedrukt!") End Sub
Belangrijke kenmerken:
Wat gebeurt er als een gebeurtenishandler meerdere keren aan hetzelfde element wordt gekoppeld?
De handler wordt zoveel keer aangeroepen als deze is toegevoegd via AddHandler, wat kan leiden tot onverwachte meerdere uitvoeringen van de logica.
AddHandler btn.Click, AddressOf Handler AddHandler btn.Click, AddressOf Handler ' Bij het indrukken van de knop wordt Handler 2 keer aangeroepen
Kan een methode met parameters die verschillen van de gebeurtenis-signatuur worden gebruikt?
Nee, de handtekening van de handler-methode moet strikt overeenkomen met de delegate van de gebeurtenis (bijvoorbeeld Sub Handler(sender As Object, e As EventArgs)). De compiler geeft een foutmelding als dit niet het geval is.
Verwijdert RemoveHandler alle verbindingen van de handler als deze meerdere keren is toegevoegd?
Nee, RemoveHandler verwijdert slechts één abonnement per aanroep. Als de handler meerdere keren is toegevoegd, moet deze even vaak worden verwijderd, anders blijft er één exemplaar verbonden.
100 knoppen worden dynamisch in een lus aangemaakt, en aan allemaal wordt een handler toegewezen, maar RemoveHandler wordt niet aangeroepen. Na het sluiten van het formulier blijft de gebeurtenis "leven", wat leidt tot frequente crashes.
Voordelen:
Nadelen:
Aan elke dynamische controle in de collectie is een benoemde handler toegevoegd, en bij het verwijderen van de controle worden in een expliciete lus alle handlers afgemeld.
Voordelen:
Nadelen: