Solved

Creating custom events with custom EventArgs in vb.net?

Posted on 2009-05-05
4
1,201 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

Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

Question has a verified solution.

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

Introduction When many people think of the WebBrowser (http://msdn.microsoft.com/en-us/library/2te2y1x6%28v=VS.85%29.aspx) control, they immediately think of a control which allows the viewing and navigation of web pages. While this is true, it's a…
Microsoft Reports are based on a report definition, which is an XML file that describes data and layout for the report, with a different extension. You can create a client-side report definition language (*.rdlc) file with Visual Studio, and build g…
Along with being a a promotional video for my three-day Annielytics Dashboard Seminor, this Micro Tutorial is an intro to Google Analytics API data.
This video shows how to use Hyena, from SystemTools Software, to bulk import 100 user accounts from an external text file. View in 1080p for best video quality.

776 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