VB.NET AddHandler – Events dynamisch verknüpfen (2026)
Mit der VB.NET AddHandler-Anweisung verknüpfst du Ereignisse zur Laufzeit mit einer Methode, statt sie fest per Handles-Klausel im Code zu verdrahten. Das ist unverzichtbar, wenn du Controls dynamisch erstellst oder Ereignisse erst nach bestimmten Bedingungen zuweisen willst. Dieser Guide behandelt die Syntax, den Unterschied zu Handles, dynamische Controls, RemoveHandler, eigene Events und gängige Fehler.
Inhaltsverzeichnis
Handles vs. AddHandler
In WinForms gibt es zwei Wege, ein Ereignis mit einer Methode zu verbinden:
' Weg 1: Handles-Klausel (statisch, zur Designzeit)
Private Sub BtnSave_Click(sender As Object, e As EventArgs) Handles BtnSave.Click
' Wird automatisch vom Designer verdrahtet
End Sub
' Weg 2: AddHandler (dynamisch, zur Laufzeit)
AddHandler BtnSave.Click, AddressOf BtnSave_Click
Private Sub BtnSave_Click(sender As Object, e As EventArgs)
' Kein "Handles" nötig
End Sub
Die Handles-Klausel funktioniert nur mit Controls, die zur Designzeit existieren. AddHandler funktioniert immer, auch mit Controls die du erst per Code erstellst. Sobald du Controls dynamisch erzeugst, ist AddHandler der einzige Weg.
AddHandler Syntax
AddHandler Objekt.Ereignis, AddressOf MethodenName
Objekt.Ereignisist das Ereignis, das du abonnieren willst (z.B.Button1.Click)AddressOfgibt einen Verweis auf die Methode zurück, die aufgerufen werden soll- Die Signatur der Methode muss zum Ereignis passen (z.B.
sender As Object, e As EventArgs)
Einfaches Beispiel
Ein Button-Click per AddHandler statt Handles:
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
AddHandler BtnGreet.Click, AddressOf BtnGreet_Click
End Sub
Private Sub BtnGreet_Click(sender As Object, e As EventArgs)
MessageBox.Show("Hallo!")
End Sub
End Class
Beachte, dass die Methode BtnGreet_Click kein Handles am Ende hat. Die Verknüpfung passiert ausschließlich über AddHandler im Load-Event.
Dynamische Controls erstellen
Der häufigste Einsatzfall für AddHandler: Controls werden per Code erzeugt und brauchen Event-Handler. Hier ein Beispiel mit dynamisch erstellten Buttons:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim categories = New List(Of String) From {
"Privat", "Geschäft", "Archiv"
}
For Each category In categories
Dim btn As New Button()
btn.Text = category
btn.Size = New Size(120, 40)
btn.Margin = New Padding(5)
AddHandler btn.Click, AddressOf CategoryButton_Click
FlowLayoutPanel1.Controls.Add(btn)
Next
End Sub
Private Sub CategoryButton_Click(sender As Object, e As EventArgs)
Dim btn = DirectCast(sender, Button)
MessageBox.Show($"Kategorie: {btn.Text}")
End Sub
Jeder Button bekommt denselben Click-Handler. Über DirectCast(sender, Button) ermittelst du, welcher Button geklickt wurde. Das funktioniert mit beliebig vielen Controls, ohne dass du für jedes einen eigenen Handler brauchst.
Komplettes Beispiel: Numpad-Tastatur
Ein realistisches Beispiel, das eine virtuelle Numpad-Tastatur zur Laufzeit erstellt. Jeder Tasten-Button wird per AddHandler mit einem gemeinsamen Handler verbunden:
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim keys = New List(Of String) From {
"7", "8", "9",
"4", "5", "6",
"1", "2", "3",
"0", "00", ","
}
For Each key In keys
Dim btn As New Button()
btn.Text = key
btn.Size = New Size(50, 50)
btn.FlatStyle = FlatStyle.Flat
btn.FlatAppearance.BorderSize = 1
btn.BackColor = Color.White
btn.Font = New Font("Segoe UI", 12, FontStyle.Bold)
AddHandler btn.Click, AddressOf NumpadButton_Click
FlowLayoutPanel1.Controls.Add(btn)
Next
End Sub
Private Sub NumpadButton_Click(sender As Object, e As EventArgs)
Dim btn = DirectCast(sender, Button)
TextBox1.Text &= btn.Text
End Sub
End Class
Du brauchst dafür nur ein FlowLayoutPanel (ca. 180 x 260 Pixel) und eine TextBox auf dem Form. Die Buttons werden komplett per Code erstellt, kein Designer nötig.
RemoveHandler: Ereignis wieder trennen
Mit RemoveHandler trennst du die Verbindung wieder. Das ist wichtig, um Memory Leaks zu vermeiden, wenn Controls zur Laufzeit entfernt werden:
' Handler zuweisen AddHandler btn.Click, AddressOf Button_Click ' Handler wieder entfernen RemoveHandler btn.Click, AddressOf Button_Click
Verwende RemoveHandler immer dann, wenn:
- Du dynamische Controls entfernst (z.B. beim Schließen eines Tabs)
- Du den Handler austauschen willst (erst Remove, dann Add)
- Du verhindern willst, dass ein Event mehrfach feuert
Mehrere Events, ein Handler
Ein Handler kann mehrere Events verarbeiten. Das ist besonders nützlich bei Formularen mit vielen ähnlichen Controls:
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
AddHandler TxtName.TextChanged, AddressOf ValidateField
AddHandler TxtEmail.TextChanged, AddressOf ValidateField
AddHandler TxtPhone.TextChanged, AddressOf ValidateField
End Sub
Private Sub ValidateField(sender As Object, e As EventArgs)
Dim txt = DirectCast(sender, TextBox)
If String.IsNullOrWhiteSpace(txt.Text) Then
txt.BackColor = Color.MistyRose
Else
txt.BackColor = Color.White
End If
End Sub
Alle drei TextBoxen teilen sich den ValidateField-Handler. Über sender wird erkannt, welche TextBox sich geändert hat.
Eigene Events mit AddHandler
Du kannst auch eigene Events definieren und per AddHandler abonnieren. Das ist nützlich für lose gekoppelte Kommunikation zwischen Klassen:
Public Class FileWatcher
Public Event FileChanged(filePath As String)
Public Sub CheckForChanges()
' Prüflogik...
RaiseEvent FileChanged("C:\data\config.xml")
End Sub
End Class
' Im Form:
Private WithEvents watcher As New FileWatcher()
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
AddHandler watcher.FileChanged, AddressOf OnFileChanged
End Sub
Private Sub OnFileChanged(filePath As String)
MessageBox.Show($"Datei geändert: {filePath}")
End Sub
Mit RaiseEvent löst die Klasse das Event aus. Der Abonnent reagiert darauf per AddHandler. So bleibt die FileWatcher-Klasse unabhängig vom Form.
Häufige Fehler
Handler wird mehrfach registriert
' SCHLECHT - bei jedem Klick wird ein weiterer Handler hinzugefügt
Private Sub BtnRefresh_Click(sender As Object, e As EventArgs) Handles BtnRefresh.Click
AddHandler Timer1.Tick, AddressOf Timer1_Tick
End Sub
' GUT - Handler nur einmal im Load registrieren
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
AddHandler Timer1.Tick, AddressOf Timer1_Tick
End Sub
Wenn du AddHandler mehrfach für dasselbe Event und dieselbe Methode aufrufst, wird die Methode auch mehrfach ausgeführt. Registriere Handler in Load oder stelle sicher, dass du vorher RemoveHandler aufrufst. Zum Thema Timer gibt es auch den VB.NET Timer Guide.
Falsche Methodensignatur
' SCHLECHT - Parameter stimmen nicht mit dem Event überein Private Sub Button_Click(text As String) End Sub ' GUT - Signatur passt zum Click-Event Private Sub Button_Click(sender As Object, e As EventArgs) End Sub
Die Methode muss exakt die Parameter-Typen haben, die das Event erwartet. Bei Click ist das (sender As Object, e As EventArgs). Der Compiler meldet einen Fehler, wenn die Signatur nicht passt.
RemoveHandler vergessen bei dynamischen Controls
Wenn du Controls per Controls.Remove() entfernst, aber den Handler nicht trennst, hält die Referenz das Objekt im Speicher. Rufe immer RemoveHandler auf, bevor du ein dynamisches Control entfernst.
FAQ
Handles verknüpft ein Event statisch zur Designzeit mit einer Methode. AddHandler verknüpft ein Event dynamisch zur Laufzeit. Für Controls die per Code erstellt werden, ist AddHandler der einzige Weg.
Ja, aber dann wird der Handler auch mehrfach ausgeführt. Falls du das nicht willst, rufe vorher RemoveHandler auf oder registriere den Handler nur einmal im Load-Event.
Immer wenn du dynamische Controls entfernst, Handler austauschen willst oder verhindern möchtest, dass ein Event mehrfach feuert. Ohne RemoveHandler kann es zu Memory Leaks kommen.
Ja. Verwende AddHandler mehrfach mit verschiedenen Controls, aber derselben Methode. Über den sender-Parameter erkennst du, welches Control das Event ausgelöst hat.
AddressOf erstellt einen Delegate, also einen typisierten Verweis auf eine Methode. Er wird zusammen mit AddHandler verwendet, um dem Event mitzuteilen, welche Methode aufgerufen werden soll.
Fazit
Die AddHandler-Anweisung macht dein Event-Handling in VB.NET flexibel. Verwende sie für dynamisch erstellte Controls, wenn du Handler zur Laufzeit zuweisen oder austauschen willst, und für eigene Events in deinen Klassen. Denke daran, RemoveHandler aufzurufen, wenn du Controls entfernst, und registriere Handler nur einmal, um Mehrfach-Ausführungen zu vermeiden. Für verwandte Themen schau dir den VB.NET Timer Guide und den VB.NET List Guide an.