Transactions can track actions that can be undone later. Changes made during a transaction can be reversed by canceling a transaction, which automatically attempts to reverse each change by setting each changed property to its pre-change value. Transactions can also improve performance during a series of operations by deferring updates to the display until the completion of the transaction.
When a transaction is in progress, some components defer their processing until the transaction has completed by listening to the TransactionOpening and TransactionClosed events. The Properties window, for example, does not update its display after a transaction has opened until the transaction has closed.
To use transactions for reversible or multiple operations, have your designer create a DesignerTransaction for each operation or series of operations which should be reversible. Be careful not to perform actions outside the transactions that might prevent a sequence of undo events from completing successfully.
You can obtain a new DesignerTransaction by calling the CreateTransaction method of an IDesignerHost. Be sure to obtain each DesignerTransaction from the active IDesignerHost in order to correctly integrate with the designer transaction processing mechanism, rather than creating a new DesignerTransaction directly.
To perform an action within a transaction, you must first create a transaction. Then you must call the OnComponentChanging method before each change or set of changes occurs, and the OnComponentChanged method after each change or set of changes occur. Finally, complete and close the transaction by calling the Commit method.
To perform a transaction, complete the following steps:
Call CreateTransaction to obtain a DesignerTransaction that can be used to control the transaction.
Within a try block, for each action that you want to track with a DesignerTransaction, call the OnComponentChanging method, make the change or changes, then call the OnComponentChanged method to signal that the change or changes have been made.
To complete the transaction, call Commit from within a finally block.
In C#, you can use the using statement rather than a try/finally block, such as in the following example.
using (host.CreateTransaction() {
// Insert your code here.
}
To cancel and attempt to roll back a transaction before it has been committed, call the Cancel method. When the Cancel method is invoked, the actions tracked by the DesignerTransaction are reversed to attempt to roll back the changes. To undo actions that occurred as part of earlier transactions, you must use the undo command provided by the development environment.