Mam formularz InfoPath, który muszę warunkowo wyłączyć jego zdarzenia OnChange. Ponieważ nie można powiązać procedur obsługi zdarzeń po załadowaniu formularza, zmuszony jestem polegać na globalnym liczniku, który wskazuje, czy powinno zostać wykonane zdarzenie OnChange. Wewnątrz każdego zdarzenia OnChange, przed wykonaniem jakichkolwiek czynności sprawdzam, czy SuppressEventsCount == 0. Aby pominąć zdarzenia podczas wykonywania jakiejś funkcji lub innej, po prostu ustawę SuppressEventsCount ++, i - ponownie, gdy funkcja zostanie zakończona. Największym problemem jest to, że nie jest to wyjątek bezpieczny. Więc miałem jasną ideę zawinąć SuppressEvents przeciwdziałać w klasie, która implementuje IDisposableImplementacja RAII w C#
using(SuppressEvents s = new SuppressEvents()){
// OnChange events fired here are ignored
} // OnChange events enabled again
To działa, ale to nie jest jeszcze tak idealny jak C++ rozwiązanie, które nie wymaga korzystania z „używając” dyrektywa w ogóle.
Czy istnieje jakiś sposób, aby albo:
- wywołać destruktor lub niektórych funkcji moment przedmiot wykracza poza zakres, OR
- zapobiec SuppressEvents obiekt przed zainicjowany poza o „używając” dyrektywa całkowicie
Zobacz to pytanie: http://stackoverflow.com/q/2101524/6345 (Czy nadużycie polega na używaniu IDisposable i "użyciu" jako sposobu uzyskania "określonego zachowania" w celu zachowania wyjątkowego bezpieczeństwa?) –