Contact me by Yahoo! Messenger skype chat Google Talk
 VB.net: Dynamic Usage Of Eventhandlers

WithEvents and Handles clause requires form us to declare the object variable and the event handler as we write our code, so linkage is created upon compilation. On the other hand, with AddHandler and RemoveHandler, linkage is created and removed at runtime, which is more flexible.

 

Let's assume that we want to load several MDI child forms, allowing each of them to be loaded only once, and of course to know when one of the child forms is closed. Since we have several forms to load we would like to use the AddHandler and RemoveHandler keywords so we can be flexible and write the minimal code we can.

 

Let's get dirty.

 

1. In each MDI child form we have to declare a public event.

Public Event FormClosed(ByVal f As Form)

 

2. In each MDI child form we have to use the Form_Closed method which handles the MyBase.Closed class and raise the FormClosed event.

 

Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) _

Handles MyBase.Closed

RaiseEvent FormClosed(Me)

End Sub

 

3. On our MDI form we need to declare two member variables. The first's of type Form and the second's type is ArrayList.

Private m_f(0) as Form

Private m_sLoadedChildForms As New ArrayList

 

4. We need to implement a method the will search the MDI child forms that are loaded. We'll also use this method when we unload the MDI child forms.

 

Private Function SearchChildForm(ByVal strSearchForm As String, _Optional ByVal idxEventHandler As Long -1) As Long

Dim i As Long 0

For i 0 To m_sLoadedForms.Count - 1

If m_sLoadedForms.Item(i) strSearchForm Then

Dim j As Long 0

For j m_f.GetLowerBound(0) To m_f.GetUpperBound(0)

If m_f(j).Name strSearchForm Then idxEventHandler j

Next j

Return i

End If

Next

Return -1

End Function

 

5. We need to implement a method to load the mdi child forms and use the SearchChildForm method in order not to load the same mdi child form second time.

 

Private Sub LoadChildForms(ByVal f As Form)

If m_f.GetUpperBound(0) > 0 Then

ReDim Preserve m_f(m_f.GetUpperBound(0) + 1)

End If

m_f(m_f.GetUpperBound(0)) f I

f Not SearchChildForm(m_f(m_f.GetUpperBound(0)).Name()) >0 Then

m_f(m_f.GetUpperBound(0)).MdiParent Me

AddHandler m_f(m_f.GetUpperBound(0)).Closed, _

AddressOf UnloadChildForm

m_f(m_f.GetUpperBound(0)).Show()

m_sLoadedChildForms.Add(m_f(m_f.GetUpperBound(0)).Name)

Else

If m_f.GetUpperBound(0) > 0 Then

ReDim Preserve m_f(m_f.GetUpperBound(0) - 1)

End If

End If

End Sub

 

6. At last we need to implement a method to take out our mdi child form from the array list so we can load it again if we want.

 

Private Sub UnloadForm(ByVal sender As System.Object, ByVal e As System.EventArgs)

Dim i As Long

Dim s As String sender.GetType().Name

Dim IndexForEventHandler -1

i SearchChildForm(s, IndexForEventHandler)

If i >0 Then m_sLoadedForms.RemoveAt(i)

If IndexForEventHandler >0 Then

RemoveHandler m_f(IndexForEventHandler).Closed, AddressOf UnloadForm

m_f(IndexForEventHandler) Nothing

End If

End Sub

 

By: Thomas Kaloyani

 

About Author

 

Thomas is an experienced Visual Basic developer, with expertise of 7+ years developing financial applications. His main IT skills are VB, SQL, Crystal Reports - should you need a VB developer for your projects feel free to contact Thomas through his personal website at www.Kaloyani.com or through www.VBprofs.com

 

Presented By: Articledashboard.com

 

http://www.articledashboard.com/Article/VB-Net--Dynamic-Usage-Of-Eventhandlers/7553


Comments are closed.

Clients Corner