Вы можете перебрать все элементы управления, но это должно быть рекурсивным, потому что элемент управления может содержать элементы управления, например, (нет нулевых проверок на краткость):
private void IterateOverControls( Control parent )
{
ProcessControl( parent );
foreach( Control control in parent.Controls )
IterateOverControls( control );
}
В ProcessControl вы можете подключить обработчики событий для обработки OnEnter (для сохранения состояния) и OnLeave (для проверки текущего состояния относительно сохраненного состояния). Вам нужно будет отцепить все обработчики событий при утилизации. Кроме того, код для сохранения проверки состояния должен был бы измениться для различных типов управления, например TextBox был бы свойством Text, но переключатель был бы индексом и т. Д. Очевидно, что это становится проще, если вы можете сравнить состояние формы с вашим базовым состоянием хранилища данных, и в этом случае вы можете просто выполнить сравнение для каждого события OnLeave.
Следует также учитывать одну вещь: нужно ли отслеживать реальные изменения? Например, у меня есть 2 переключателя: A и B. Я проверяю B (изменение), поэтому изменяется кнопка out или что-либо еще со свойством Enabled. Затем я нажимаю на A (то есть обратно в исходное состояние). Вам нужно вернуть кнопку в этот момент?
Вот почему вы должны обратить внимание на подход контроллера модели:)