Ваша проблема textBox3.Clear()
. Если текст есть, он снова запускает событие TextChanged
.
Я бы посоветовал вам использовать событие Validate вместо события TextChanged. Таким образом, вы не проверяете значение до тех пор, пока пользователь не выйдет из текстового поля и не изменит значение в обработчике событий, событие не будет запущено снова
* Исправление - я должен был сказать «Подтверждение события».
Предполагая, что вы знаете, как назначить обработчик события определенному событию, вы можете использовать тот же код с некоторыми небольшими изменениями. Примерно так должно работать:
private void textBox3_Validating(object sender, CancelEventArgs e)
{
int val = 0;
bool res = Int32.TryParse(textBox3.Text, out val);
if (res == true && val > -1 && val < 101)
{
// add record
e.Cancel = false;
}
else
{
textBox3.Clear();
e.Cancel = true;
MessageBox.Show("Please input 0 to 100 only.");
}
}
Если вам нужна помощь в назначении обработчика событий, вы можете легко назначить обработчик и создать заглушку кода, найдя правильное событие в списке событий в сетке свойств и дважды щелкнув по нему. Просто скопируйте содержимое этого метода в новый.
Похоже, вы изменяете сгенерированный код напрямую. Это не очень хорошая идея. Используйте метод, который я описал выше, чтобы добавить новый обработчик событий.
Чтобы удалить существующий, удалите имя метода, сохраненное с этим событием, в списке событий, а затем, при необходимости, удалите сам код.
Чтобы избавиться от дополнительных срабатываний обработчика событий, вместо очистки сбросьте для текстового поля допустимое значение по умолчанию (textBox3.Text = "0"
).
На заметку. Рассматривали ли вы вместо этого элемент управления NumericUpDown?