Solved

Creating custom events with custom EventArgs in vb.net?

Posted on 2009-05-05
4
1,153 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
Comment Utility
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
Comment Utility
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
Comment Utility
I have not played with WPF at all unfortunately...   =\
0
 
LVL 1

Author Comment

by:kkamm
Comment Utility
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 Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Introduction As chip makers focus on adding processor cores over increasing clock speed, developers need to utilize the features of modern CPUs.  One of the ways we can do this is by implementing parallel algorithms in our software.   One recent…
Parsing a CSV file is a task that we are confronted with regularly, and although there are a vast number of means to do this, as a newbie, the field can be confusing and the tools can seem complex. A simple solution to parsing a customized CSV fi…
This video discusses moving either the default database or any database to a new volume.
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.

763 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

Need Help in Real-Time?

Connect with top rated Experts

9 Experts available now in Live!

Get 1:1 Help Now