InfiniteLoop
InfiniteLoop

Reputation: 93

How to share events between forms

So i have a tray icon that should behave the same way between 3 forms. I then created this code:

Private Sub TrayForm_MouseClick(sender As Object, e As MouseEventArgs) Handles NotifyIcon1.MouseClick
    If e.Button = MouseButtons.Right Then
        If Not Application.OpenForms().OfType(Of TrayForm).Any = 1 Then
            TrayForm.ContextMenuStrip1.Show(Cursor.Position)
        End If
    End If
End Sub

Which is used to handle the tray icon. How can i do to share this event between the forms so i don't have to place this same code on every form?

How are event handlers working exactly? I looked online and on MSDN and it is not clear to me.

Thanks

Upvotes: 0

Views: 94

Answers (2)

laancelot
laancelot

Reputation: 3207

Are you sure that you want to share the event, and not juste the code that will handle the event?

If you don't want to copy and paste your code, which you need to handle the events of more than one form, here's a way to do it:

Declare the sub which contains the code needed to handle the event as a public shared sub. Like this:

Public Shared Sub TrayForm_MouseClick(sender As Object, e As MouseEventArgs)

So, now you have a Sub which can handle the event you want to handle from all three forms.

Now, when you initialize those forms, add a line to make the shared Sub handle the event you want it to handle:

AddHandler NotifyIcon1.MouseClick, AddressOf ProjectName.FileName.TrayForm_MouseClick

ProjectName.FileName is meant here to be the path to refer to the shares Sub inside the file where you put it. I usually name it like ProjectNameUtils.vb or something like that.

If you just want to avoid copy and pasting your Sub so you don't have to modify it at several places every time you change something, this could be a way to achieve that.

Upvotes: 1

InfiniteLoop
InfiniteLoop

Reputation: 93

As Stipulated by Hans Passant:

Sub Eclass_EventHandler(sender As Object, e As MouseEventArgs) Handles Me.MouseClick
    If e.Button = MouseButtons.Right Then
        If Not Application.OpenForms().OfType(Of TrayForm).Any = 1 Then
            Me.ContextMenuStrip1.Show(Cursor.Position)
        End If
    End If
End Sub

On the Trayform.VB just did the trick.

But about the shared event. i Have one that would have to be:

Private Sub FormClosingEVENT(sender As System.Object, e As System.Windows.Forms.FormClosingEventArgs) Handles MyBase.FormClosing
    If Not FromMenu Then e.Cancel = True
    Me.WindowState = FormWindowState.Minimized
    'Application.Exit()
End Sub

How should i handle this?

Upvotes: 1

Related Questions