CustomEvent vb.net

domenica 25 gennaio 2015 - 15.19
Tag Elenco Tags  VB.NET  |  .NET 4.0

86Marco Profilo | Expert

Buon pomeriggio amici,
sto creando un piccolo progettino aziendale in vb.net.

Per semplificare il tutto Vi rimetto parte del codice utilizzato con procedure semplificate.

Ho questa classe Calc, contenente un Evento, un delegate e sue sub che esplodono l'evento OnRisultato. Inoltre utilizzo un classe derivata da EventArgs per passare all'evento dei parametri da restituirmi:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Nel codice Form ho il seguente listato:
Dim c As New Calc Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click AddHandler c.OnRisultato, AddressOf m_StampaRisultato c.Addizione(1, 3) End Sub Private Sub m_StampaRisultato(ByVal sender As Object, ByVal e As RisultatoEventArgs) MsgBox("La stampa del risultato è: " & e.Risultato) Exit Sub End Sub

Mi succede una cosa "strana".
Se eseguo per la prima volta il progetto e faccio click sul Button1, viene riferito il risultato con una Msgbox. Tutto ok qui!
Se chiudo la messageBox e rifaccio click sul pulsante, mi riesce l'alert con il risultato per 2 volte.
Se rifaccio click sul pulsante il risultato mi viene riproposto 3 volte.... ma come mai?

Sbaglio qualcosa?

Grazie a tutti

AntCiar Profilo | Expert

Ciao.

E' normale che faccia così. Ogni volta che richiami l'istruzione

AddHandler c.OnRisultato, AddressOf m_StampaRisultato

si mette in ascolto dell'evento in una sorta di "coda". N volte richiami l'istruzione e N volte si scatenerà l'evento.

Ora hai due soluzioni:

1 - prima di metterti in ascolto dell'evento, richiama la "rimozione" dell'ascolto dell'evento:

RemoveHandler c.OnRisultato, AddressOf m_StampaRisultato AddHandler c.OnRisultato, AddressOf m_StampaRisultato

2 - Verifica se l'oggetto contenente l'evento 'OnRisultato' ha una visibilità globale oppure lo usi solo in una sub/funcion specifica.

Se è globale, allora sicuramente lo avrai dichiarato come:

private ...... as ...... = new ........ () (oppure anche public .......)

aggiungi nella dichiarazione la clausola WithEvents

Private WithEvents NOME as ....... = new ......... ()


Poi ti dhichiari il tuo metodo di ascolto dell'evento

Private Sub StampaRisultato(Byval ..... as ....., Byval ......)

e dopo la chiusura della parentesi ci aggiungi

Handles NOME.OnRisultato


In questo modo non ti devi preoccupare tu di metterti in ascolto dell'evento.



poi per maggiori informazioni puoi consultare questo link:

https://msdn.microsoft.com/en-us/library/stf7ebaz%28v=vs.90%29.aspx


Cristian Barca

86Marco Profilo | Expert

Ciao AntCiar e grazie per l'aiuto.
Effettivamente il problema è che inizializzo l'istanza della classe Calc di tipo globale.

A questo punto vorrei chiederti una informazione.

Per i miei progetti ho sempre lavorato come mi hai consigliato tu: nella classe dichiaro degli eventi e poi nel modulo dell'applicazione inizializzo l'istanza di classe con la clausola WithEvents, facendo preoccupare il compilatore a gestire gli eventi.

Mi sono però messo a leggere una guida dove insegnava la gestione degli eventi con i relativi Delegate.
A questo punto chiedo: che differenza c'è nella gestione degli eventi con delegate (come da mia prima richiesta) e senza (cioè inizializzando la classe con WithEvents)?

Mi dai una rinfrescata se puoi?
Spero di essere stato chiaro nell'esporre la domanda.

Grazie mille e buona serata.
Marco
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5