I have an InfoPath form which I need to conditionally disable it’s OnChange events. Since it’s not possible to bind the event handlers after the form has loaded, I’m forced to rely on a global counter which indicates whether an OnChange event should be executed.
Inside each OnChange event, I check whether SuppressEventsCount == 0 before performing any actions.
To suppress events during the execution of some function or another, I simply set SuppressEventsCount++, and — again when the function exits. The biggest problem with doing this is that it’s not exception safe. So I had the bright idea to wrap the SuppressEvents counter in a class which implements iDisposable
using(SuppressEvents s = new SuppressEvents()){
// OnChange events fired here are ignored
} // OnChange events enabled again
This is working, but it’s still not as ideal as a c++ solution which doesn’t require the use of the “using” directive at all.
Is there some way to either:
- Trigger a destructor or some function the moment an object goes out of scope, OR
- Prevent the SuppressEvents object from being initialised outside of a “using” directive entirely
In relation to question 2, it might be possible to get around it by providing a different interface to consumers of the code. Instead of providing a public class that implements
IDisposable, and hoping they wrap it in ausing, you could provide a static method that takes a function to execute in a “suppressed” context:Then consumers can use this as follows:
Of course, you have to work out whether this design is appropriate, as this will result in extra function calls, compiler generated classes and closures etc.