Ho un modulo di InfoPath che mi serve per disabilitare in modo condizionale gli eventi OnChange. Poiché non è possibile associare i gestori di eventi dopo che il modulo è stato caricato, sono costretto a fare affidamento su un contatore globale che indica se un evento OnChange deve essere eseguito. All'interno di ogni evento OnChange, controllo se SuppressEventsCount == 0 prima di eseguire qualsiasi azione. Per sopprimere gli eventi durante l'esecuzione di una funzione o un'altra, ho semplicemente impostato SuppressEventsCount ++ e - di nuovo quando la funzione termina. Il più grande problema con questo è che non è sicuro. Così ho avuto la brillante idea di avvolgere le SuppressEvents contatore in una classe che implementa IDisposableImplementazione di RAII in C#
using(SuppressEvents s = new SuppressEvents()){
// OnChange events fired here are ignored
} // OnChange events enabled again
Questo è il lavoro, ma non è ancora così ideale come soluzione di C++ che non richiede l'uso del "usando" direttiva affatto.
c'è qualche modo per uno:
- trigger un distruttore o qualche funzione del momento in cui un oggetto si passa nell'ambito, OR
- Prevenire gli SuppressEvents oggetto venga inizializzato al di fuori di un "tramite" direttiva interamente
Vedere questa domanda: http://stackoverflow.com/q/2101524/6345 (È abusivo usare IDisposable e "using" come mezzo per ottenere "comportamento scoped" per la sicurezza delle eccezioni?) –