Friday, May 18, 2012

VB.NET: L'uso dinamico di Eventhandlers

WithEvents e maniglie clausola richiede forma noi per dichiarare la variabile oggetto e il gestore eventi come scrivere il nostro codice, quindi collegamento viene creato su di compilazione. D'altra parte, con metodi AddHandler e RemoveHandler, collegamento viene creato e rimosso in fase di esecuzione, che è più flessibile.


Supponiamo che vogliamo caricare il form diversi figlio MDI, permettendo a ciascuno di essi deve essere caricato solo una volta, e ovviamente sapere quando una delle forme bambino è chiuso. Dal momento che abbiamo diverse forme di caricare vorremmo utilizzare le parole chiave AddHandler e RemoveHandler così possiamo essere flessibili e scrivere il codice minimo che possibile.


Let's get sporco.


1. In ciascun form figlio MDI dobbiamo dichiarare un evento pubblico.
Pubblica evento FormClosed (ByVal f come forma)


2. In ciascun form figlio MDI ci devono utilizzare il metodo Form_Closed, che gestisce la classe MyBase.Closed e generare l'evento FormClosed.


Private Sub Form1_Closed(ByVal sender As Object, ByVal e As System.EventArgs) _
Maniglie MyBase.Closed
RaiseEvent FormClosed(Me)
End Sub


3. Il nostro form MDI abbiamo bisogno di dichiarare due variabili membro. Il primo di tipo Form e il tipo del secondo è ArrayList.
M_f(0) privato come forma
Private m_sLoadedChildForms As New ArrayList


4. Abbiamo bisogno di implementare un metodo la volontà di ricerca i form figlio MDI che vengono caricati. Useremo anche questo metodo quando si scaricano i form figlio MDI.


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
Se m_sLoadedForms.Item(i) = strSearchForm Then
Dim j As Long = 0
For j = m_f.GetLowerBound(0) a m_f.GetUpperBound(0)
Se m_f(j).Nome = strSearchForm poi idxEventHandler = j
Prossimo j
Restituire i
End If
Prossimo
Ritorno -1
End Function


5. Abbiamo bisogno di implementare un metodo per caricare i form figlio mdi e utilizzare il metodo SearchChildForm in ordine di non per caricare i form figlio mdi stesso seconda volta.


Private Sub LoadChildForms(ByVal f As Form)
Se m_f.GetUpperBound(0) > 0 Then
ReDim Preserve m_f(m_f.GetUpperBound(0) + 1)
End If
m_f(m_f.GetUpperBound(0)) = f ho
f non 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)).Chiuso _
AddressOf UnloadChildForm
m_f(m_f.GetUpperBound(0)).Show()
m_sLoadedChildForms.Add(m_f(m_f.GetUpperBound(0)).Nome)
Altro
Se m_f.GetUpperBound(0) > 0 Then
ReDim Preserve m_f(m_f.GetUpperBound(0) - 1)
End If
End If
End Sub


6. Finalmente abbiamo bisogno di implementare un metodo per estrarre il nostro form figlio mdi dall'elenco matrice così noi possiamo caricare nuovamente se vogliamo.


Private Sub UnloadForm(ByVal sender As System.Object, ByVal e As System.EventArgs)
Dim I As Long
Dim s As String = sender.GetType ().Nome
Dim IndexForEventHandler = -1
io = SearchChildForm (s, IndexForEventHandler)
Se mi > = 0 allora m_sLoadedForms.RemoveAt(i)
Se IndexForEventHandler > = 0 Then
RemoveHandler m_f(IndexForEventHandler).Chiuso, AddressOf UnloadForm
m_f(IndexForEventHandler) = Nothing
End If
End Sub

No comments:

Post a Comment