Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Handle ALL events in one handler?

Is it possible in VB.NET to easily write an event handler that will handle every event that fires? I'm wondering if one could make a logging system using something like this.

I'm wanting to do something like (in pseudocode):

Public Sub eventHandledEvent(ByVal sender As Object, ByVal e As EventArgs)
    File.Write(sender.EventName)
End Sub

I realize it would be slow, but it wouldn't be for a production system, only as a development tool.

like image 297
davidscolgan Avatar asked Jul 19 '10 18:07

davidscolgan


People also ask

Can multiple event handlers be added to a single element?

You can add many event handlers to one element. You can add many event handlers of the same type to one element, i.e two "click" events. You can add event listeners to any DOM object not only HTML elements.

Which is the most preferred way of handling events?

The addEventListener method is the most preferred way to add an event listener to window, document or any other element in the DOM.


1 Answers

You can do this with reflection. Here's how. Create a form with a textbox called TextBox1. Paste the following code. Run the project and look at the immediate window.

Public Class Form1

  Private Sub Form1_Activated(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Activated
    RegisterAllEvents(TextBox1, "MyEventHandler")
  End Sub

  Sub MyEventHandler(ByVal sender As Object, ByVal e As EventArgs)
    Debug.WriteLine("An event has fired: sender= " & sender.ToString & ", e=" & e.ToString)
  End Sub
  Sub RegisterAllEvents(ByVal obj As Object, ByVal methodName As String)
    'List all events through reflection'
    For Each ei As System.Reflection.EventInfo In obj.GetType().GetEvents()
      Dim handlerType As Type = ei.EventHandlerType
      Dim method As System.Reflection.MethodInfo = Me.GetType().GetMethod(methodName)
      'Create a delegate pointing to the method'
      Dim handler As [Delegate] = [Delegate].CreateDelegate(handlerType, Me, method)
      'Register the event through reflection'
      ei.AddEventHandler(obj, handler)
    Next
  End Sub
End Class

This is from Francesco Balena's book Programming Microsoft Visual Basic 2005 The Language. The techique works with any object that raises events, not just controls. It uses contravariance.

If you buy the book, there's a full explanation and some more code which will allow you to identify which event has fired in the universal handler, and use regular expressions to handle only a subset of events. I don't feel I can post such a long excerpt here.

like image 196
MarkJ Avatar answered Sep 23 '22 06:09

MarkJ