Циклический контроль может работать, но он подвержен ошибкам. Я работал над проектом, который использовал эту технику (если это был проект Delphi, а не C #), и он работал как ожидалось, но было очень трудно обновить, если элемент управления был добавлен или изменен. Это могло быть исправимо. Я не уверен.
В любом случае это работало путем создания отдельного обработчика событий, который затем присоединялся к каждому элементу управления. Затем обработчик будет использовать RTTI для определения типа элемента управления. Затем он использовал бы свойство name элемента управления в большом операторе select, чтобы найти код проверки для запуска. Если проверка не удалась, пользователю было отправлено сообщение об ошибке, и элемент управления получил фокус. Чтобы сделать вещи более сложными, форма была разделена на несколько вкладок, и нужная вкладка должна была быть видимой, чтобы ее дочерний элемент управления был в фокусе.
Так вот мой опыт.
Я бы предпочел использовать шаблон проектирования Passive View, чтобы удалить все бизнес-правила из формы и перенести их в класс Presenter. В зависимости от состояния вашей формы, это может быть больше работы, чем ваше желание инвестировать.