Events

Heiko

Well-known member
Joined
Feb 10, 2003
Messages
430
Location
Holstein, Germany.
Dont 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 dont 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 dont 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 didnt.

However .... :)

... passing methods and events as delegates wont 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 cant 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 wouldnt work. :(

Code:
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. Wont work with the delegate. (Can not cast between my delegates type and the eventhandlers required type. Bummer.

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

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

Its probably because its Friday evening but Im not sure I fully understand what youre trying to do. If that doesnt 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 cant do, of course).

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