Model zdarzeń w Visual Basic pozwala na reagowanie na działania użytkownika poprzez obsługiwacze zdarzeń, które są powiązane z kontrolkami. Jest to kluczowe dla programów z GUI (interfejsem graficznym), gdzie każdy element może wywoływać własne zdarzenia.
W klasycznym VB6 obsługa zdarzeń realizowana była poprzez statyczne powiązanie kontrolka — metoda. W VB.NET i WinForms model stał się bardziej elastyczny: teraz do jednego zdarzenia można przypisać wiele obsługiwaczy, wspierane jest dynamiczne powiązanie poprzez AddHandler/RemoveHandler.
Typową trudnością jest dynamiczne dodawanie kontrolek i zarządzanie ich zdarzeniami. Jeżeli nie odsubskrybowano zdarzeń lub niewłaściwie powiązano obsługiwacz, mogą wystąpić wycieki pamięci, duplikowanie wywołań, utrata kontroli nad zachowaniem UI.
Podczas dynamicznego tworzenia kontrolek użyj AddHandler do subskrypcji i RemoveHandler do poprawnego usuwania obsługiwacza. Zwracaj uwagę na czas życia kontrolek — jeśli kontrolka zostaje zniszczona, należy odsubskrybować obsługiwacze, w przeciwnym razie pozostaną "wiszące" referencje.
Przykład kodu:
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("Przycisk naciśnięty!") End Sub
Kluczowe cechy:
Co się stanie, jeśli obsługiwacz zdarzenia zostanie podłączony kilka razy do tego samego elementu?
Obsługiwacz zostanie wywołany tyle razy, ile razy został dodany przez AddHandler, co może prowadzić do niespodziewanego wielokrotnego wykonania logiki.
AddHandler btn.Click, AddressOf Handler AddHandler btn.Click, AddressOf Handler ' Przy naciśnięciu przycisku Handler zostanie wywołany 2 razy
Czy można użyć metody z parametrami różniącymi się od sygnatury zdarzenia?
Nie, podpis metody-obsługiwacza musi ściśle odpowiadać delegatowi zdarzenia (na przykład Sub Handler(sender As Object, e As EventArgs)). Kompilator zgłosi błąd w przeciwnym razie.
Czy RemoveHandler usuwa wszystkie wystąpienia obsługiwacza, jeśli został dodany kilka razy?
Nie, RemoveHandler usuwa tylko jedno powiązanie za wywołanie. Jeśli obsługiwacz był dodawany kilka razy, należy go usuwać tyle samo razy, w przeciwnym razie jedno wystąpienie pozostanie powiązane.
Dynamicznie tworzonych jest 100 przycisków w pętli, i na wszystkie przypisywany jest obsługiwacz, ale RemoveHandler nie jest wywoływane. Po zamknięciu formularza zdarzenie nadal "żyje", co prowadzi do częstych awarii.
Zalety:
Wady:
Każdemu dynamicznemu kontrolkowi w kolekcji dodawany jest obsługiwacz, nazwany, i przy usuwaniu kontrolki w wyraźnej pętli odsubskrybowywane są wszystkie obsługiwacze.
Zalety:
Wady: