Events

Heiko

Contributor
Joined
Feb 10, 2003
Messages
430
Location
Holstein, Germany.
Don't know if this is language specific, so please move if required.

Scenario:
Loads of UserControls with loads of "IExtendedControls" on them, which are often added at runtime.

IExtendedControls can raise an Event "ShowHistory (Sender as Object, e as ShowHistoryEventArgs)".

Quite naturally I do not want to manually add handlers to each and every IExtendedControl. I am doing this with a helper class, which will receive a root-control, a delegate and the will recurse through the root-controls control collection, check if the collection members implement IExtended and add the handler.

Now this:
Most Probably "ShowHistory" will not remain the only event that I want to fetch. So it would be quite convenient if I could also dynamically pass the event to the helper class.

I don't see this is possible within the framework.
Maybe I could pass the Event "ByName" and then use System.Reflection to find out, if an object can raise the desired event. Still I don't have a way to describe this event in an

AddHandler Object as Event, Object as Delegate

statement. (VB.NET says, there is no such type as "Event")
 
The type you are looking for is Delegate. You might well get further with that, you should certainly be able to pass Events around as type Delegate anyway.
 
Thanks for answering - because your answer made me doubt I was using delegates correctly and indeed I didn't.

However .... :)

... passing methods and events as delegates won't help me with the isse because the events do have different eventarg classes, thus different signatures, so the Eventhandlers have different signatures as well.


But, on the other hand, I can't even figure out how to do it with one specific delegate. I read a thread here on "delegates, eventhandlers, oh my" and I tried to copy it, but It still wouldn't work. :(

Visual Basic:
Public Class AutoHandlerAttacher
    Public Sub New(ByVal Parent As Control, ByRef Method As ShowHistoryHandler)
        mParent = Parent
        mMethod = Method
    End Sub

    Private mParent As Control
    Private mMethod As ShowHistoryHandler

    Public Delegate Sub ShowHistoryHandler(ByVal Sender As Object, ByRef e As ShowHistoryEventArgs)
    Private Sub Dummy(ByVal Sender As Object, ByRef e As ShowHistoryEventArgs)

    End Sub
)

    Private Sub AttachHandler()

        Dim aCtrl As Control
        Dim aIECtrl As IExtendedControl

        Dim typeIEC As Type = GetType(DSO.isys.ControlLibrary.IExtendedControl)

        '-------------------------------------------
        For Each aCtrl In mParent.Controls
            If typeIEC.IsInstanceOfType(aCtrl) Then
                aIECtrl = CType(aCtrl, IExtendedControl)
                AddHandler aIECtrl.ShowHistory, mMethod
                AddHandler aIECtrl.ShowHistory, AddressOf Me.Dummy
            End If
        Next

    End Sub

End Class

Works with the Dummy. Won't work with the delegate. (Can not cast between my delegate's type and the eventhandlers required type. Bummer.

Any hints?
 
I believe that first AddHandler line should be something like this:

Visual Basic:
AddHandler aIECtrl.ShowHistory, New ShowHistoryHandler(AddressOf mMethod)

It's probably because it's Friday evening but I'm not sure I fully understand what you're trying to do. If that doesn't help, could you outline it again with the code you have so far?
 
This is pretty much the code I have so far :) unless you want me to post the entire project (which I can't do, of course).

Your attempt didn't work either. Well nevermind, I have decided to tackle the problem in another manner. But thanks a lot anyway.
 
Back
Top