Не допускать нуля в текстовом поле
-
21-08-2019 - |
Вопрос
Мне нужно текстовое поле, в которое только пользователь может разрешить вводить целые числа.Но пользователь не может ввести ноль.то есть он может ввести 10 100 и т.д.Не 0 в одиночку.Как я могу создать событие в KeyDown?
Решение
То, как вы планируете это сделать, очень раздражает пользователя.Вы догадываетесь, что пользователь хочет ввести, и действуете в соответствии со своей догадкой, но вы можете сильно ошибаться.
В нем также есть отверстия, например, пользователь может ввести "10", а затем удалить "1".Или он мог бы вставить "0" - вы ведь разрешаете вставлять, не так ли?
Таким образом, мое решение было бы следующим:позвольте ему ввести любую цифру, которая ему нравится, любым способом, который ему нравится, и только подтвердите ввод после он закончил, например, когда ввод теряет фокус.
Другие советы
Почему бы не использовать NumericUpDown и не сделать следующие настройки:
upDown.Minimum = 1;
upDown.Maximum = Decimal.MaxValue;
Использование int.Попробуйте проанализировать преобразовать текст в число и проверить, не равно ли это число 0.Используйте Проверка подлинности событие для проверки.
// this goes to you init routine
textBox1.Validating += textBox1_Validating;
// the validation method
private void textBox1_Validating(object sender, CancelEventArgs e)
{
if (textBox1.Text.Length > 0)
{
int result;
if (int.TryParse(textBox1.Text, out result))
{
// number is 0?
e.Cancel = result == 0;
}
else
{
// not a number at all
e.Cancel = true;
}
}
}
Редактировать:
Хорошо, поскольку вы используете WPF, вам следует взглянуть на то, как реализовать проверка способом WPF.Вот класс проверки, который реализует приведенную выше логику:
public class StringNotZeroRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (textBox1.Text.Length == 0)
return new ValidationResult(true, null);
int result;
if (int.TryParse(textBox1.Text, out result))
{
// number is 0?
if (result == 0)
{
return new ValidationResult(false, "0 is not allowed");
}
}
else
{
// not a number at all
return new ValidationResult(false, "not a number");
}
return new ValidationResult(true, null);
}
}
Это еще одна вариация на тему:
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
char newChar = Convert.ToChar(e.KeyValue);
if (char.IsControl(newChar))
{
return;
}
int value;
e.SuppressKeyPress = int.TryParse((sender as TextBox).Text + newChar.ToString(), out value) ? value == 0 : true;
}
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (textBox1.Text == "" && e.KeyChar == '0')
{
e.Handled = true;
return;
}
if (e.KeyChar < '0' || e.KeyChar > '9')
{
e.Handled = true;
return;
}
}
не очень приятно, но это работает