Не пытайтесь проверять нажатия клавиш по одному.
1) Вы только что обнаружили, что Backspace требует больше кода, теперь добавлена поддержка вырезания / копирования и вставки, а клавиша удаления и ввод текста заменяют выделение. Код не очень хороший.
2) Это только смущает пользователя. Или хуже, они пытаются и введите. отделив дату в поле, вы вводите эту дату в допустимое число, игнорируя второе. и теперь они ввели что-то совершенно неверное, и ваша программа не скажет им.
Событие проверки текстового поля - то, куда должна идти эта логика. Он срабатывает, когда фокус перемещается на другой элемент управления (свойство CausesValidation которого имеет значение true, это позволяет нажимать кнопки отмены, даже если текущий элемент управления не находится в допустимом состоянии).
В проверяющем событии вы можете выполнить все необходимые проверки и отменить событие, если данные неверны, а также отобразить любое сообщение, которое вам нужно. Чтобы проверить значение, я бы предложил начать с Single.TryParse, а затем, если преобразование выполнится успешно, вы можете продолжить выполнять любые проверки диапазона, которые вам требуются. TryParse лучше, чем совет @ Bork, потому что он легче читается и позволяет избежать выброса / отлова ненужных исключений.
РЕДАКТИРОВАТЬ: только что заметил, что вы также ограничивает длину введенного текста. Вы можете сделать это, установив свойство MaxLength в TextBox.