Solved

Creating custom events with custom EventArgs in vb.net?

Posted on 2009-05-05
4
1,227 Views
Last Modified: 2012-05-06
I have an application where I would like to create an event system that will pass a custom event argument to a series of form controls.

Essentially, this is meant to be a rudimentary access control mechanism. The custom argument will contain an object that will indicate a requested access level and each control will then take actions based on the values in the passed event argument.

I was looking into defining a custom event (see attached snippet), but I am not quite sure how to wire all this up.

A couple of questions:

1) Is this do-able? Can an entire class be passed as an event argument?
2) Will a disabled control still be able to receive a custom event message?
3) Can all my controls respond to the same custom event at the same time?
4)  How do I wire all this up?

I was thinking about deriving control classes from each of the UI control types I will be using so that I can define the custom event handler for each UI control from within the derived control class. I could add the handler when I create an instance of the control and remove it on disposal. Does that make sense?

Public Enum AccessLevels As Integer
    Guest    ' Read Only access (and non-SSN reports)
    Staff  ' Team Managers & Staff
    Physician    ' Area Managers
    Administrator         ' Administrator
End Enum
 
Public Class AccessToken
    Private _AccessLevel As AccessLevels
    Public Property AccessLevel() As AccessLevels
        Get
            Return _AccessLevel
        End Get
        Set(ByVal value As AccessLevels)
            _AccessLevel = value
        End Set
    End Property
 
    Public Sub New(ByVal Level As AccessLevels)
        AccessLevel = Level
    End Sub
End Class
 
Public Class MyEventArg
        Inherits EventArgs
        Private _Token As AccessToken
        Public Property Token() As AccessToken
            Get
                Return _Token
            End Get
            Set(ByVal value As AccessToken)
                _Token = value
            End Set
        End Property
 
    End Class
 
Public Custom Event AccessLevelEvent As EventHandler
        AddHandler(ByVal d As EventHandler)
        End AddHandler
        RemoveHandler(ByVal d As EventHandler)
        End RemoveHandler
        RaiseEvent(ByVal sender As Object, ByVal e As MyEventArg)
        End RaiseEvent
    End Event

Open in new window

0
Comment
Question by:kkamm
  • 2
  • 2
4 Comments
 
LVL 85

Accepted Solution

by:
Mike Tomlinson earned 500 total points
ID: 24305837
Let's answer those questions...

#1
It makes perfect sense and is completely "do-able".  =)
You can pass ANYTHING in a custom event...and pass more than one parameter if desired (it is, after all, a "custom" event!).

#2
A disabled control will still receive custom messages...it just typically won't receive USER input from the mouse/keyboard.

#3
Yes..ALL subscribers to an event will be notified when it is fired...you just can't predict the ORDER in which they will be notified.

#4
I think you already nailed it...use AddHandler() when you create the controls.

A simple example of a custom event passing non-standard parameters:
Public Class Form1
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim sc As New SomeClass
        AddHandler sc.SomeEvent, AddressOf sc_SomeEvent
        sc.SomeSub()
    End Sub
 
    Private Sub sc_SomeEvent(ByVal Priority As Integer, ByVal data As SomeData)
        Dim msg As String = String.Join(" ", New String() {data.a, data.b, data.c})
        MessageBox.Show(msg, Priority.ToString)
    End Sub
 
End Class
 
Public Class SomeClass
 
    Public Event SomeEvent(ByVal Priority As Integer, ByVal data As SomeData)
 
    Public Sub SomeSub()
        RaiseEvent SomeEvent(411, New SomeData("Idle_Mind", "was", "here"))
    End Sub
 
End Class
 
Public Class SomeData
 
    Public a, b, c As String
 
    Public Sub New(ByVal a As String, ByVal b As String, ByVal c As String)
        Me.a = a
        Me.b = b
        Me.c = c
    End Sub
 
End Class

Open in new window

0
 
LVL 1

Author Comment

by:kkamm
ID: 24309057
Thanks for the input, Idle Mind.

Have you dealt with this in a WPF context by any chance?
0
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 24309161
I have not played with WPF at all unfortunately...   =\
0
 
LVL 1

Author Comment

by:kkamm
ID: 24317947
This will ultimately be used in a WPF context, so I have to do this via routed events, but I don't think the basic functionality should be much different.

At any rate, the question was essentially answered for me. Thanks for the assist.
0

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

This tutorial demonstrates one way to create an application that runs without any Forms but still has a GUI presence via an Icon in the System Tray. The magic lies in Inheriting from the ApplicationContext Class and passing that to Application.Ru…
Well, all of us have seen the multiple EXCEL.EXE's in task manager that won't die even if you call the .close, .dispose methods. Try this method to kill any excels in memory. You can copy the kill function to create a check function and replace the …
In an interesting question (https://www.experts-exchange.com/questions/29008360/) here at Experts Exchange, a member asked how to split a single image into multiple images. The primary usage for this is to place many photographs on a flatbed scanner…

830 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question