Какова цель здесь? Похоже, вы пытаетесь создать маску клавиатуры, где какой-либо неподтверждающий символ выдает предупреждение? Если это так, вы можете найти счастье в DataGridView, добавив MaskedTextBoxColumn. MaskedTextBoxColumn контролирует ввод гораздо более разумным способом, чем принудительное изменение фиксации.
См. Здесь код, который показывает, как его использовать: http://msdn.microsoft.com/en-us/library/ms180996.aspx
В соответствии с вашими обновленными критериями в комментариях, похоже, что ваше решение, вероятно, примерно так же хорошо, как и будет. Однако поймите, что очень легко попасть в бесконечные циклы событий, когда у вас есть другие элементы управления, обновляемые в другом на основе событий клавиатуры. Вероятно, вам лучше всего иметь одного делегата в форме, который обрабатывает все события, поскольку он может предотвратить бесконечные циклы триггеров событий, отбрасывая ложные события на основе состояния.
По сути, это будет использование шаблона Presenter Model Viewer, где ваш делегат выступает в качестве докладчика и управляет трафиком вашего View (вашего пользовательского интерфейса).
Делая это, вы даже можете переместить логику Presenter в новый класс, к которому затем привязываете данные, что позволит вам полностью контролировать пользовательский интерфейс из одной логической конструкции, а не из мешанины обработчиков событий.