Довольно часто возникает задача сделать так, чтобы в текстовом поле можно было вводить только числовые данные.
В Delphi (C++ Builder) эта проблема частично решается с помощью установки соответствующих свойств компонента TEdit. Однако ни в Windows Forms ни в WPF этого нет.
Поэтому, запрещать ввод посторонних символов необходимо исключительно в коде программы. К счастью, это сделать не сложно.
Windows Forms
Для того чтобы запретить ввод посторонних символов нужно выполнить фильтрацию ввода в событии KeyPress.
У этого события есть свойство «KeyChar», которое хранит в себе вводимый символ. С помощью метода IsDigit класса Char можно проверить является ли этот символ цифрой. Если да, то разрешаем ввод, если нет запрещаем.
Ввод происходит только тогда, когда логическое свойство «Handled» события равно «ложь». Это позволяет при проверке обойтись без условного оператора.
1 2 3 4 |
private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = !(Char.IsDigit(e.KeyChar)); } |
Если необходимо реализовать ввод десятичных дробей, то просто добавляется дополнительная проверка на соответствие вводимого символа десятичному разделителю и чтобы этот разделитель встречался во введённом тексте не более одного раза.
1 2 3 4 |
private void textBox1_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = !(Char.IsDigit(e.KeyChar) || ((e.KeyChar==System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0])&&(DS_Count(((TextBox)sender).Text)<1))); } |
Конструкция System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0] предназначена для того чтобы получить актуальное значение системного десятичного разделителя.
Подсчёт числа вхождений десятичного разделителя для проверки его «единственности» выполняется при помощи следующего метода
1 2 3 4 5 6 |
public int DS_Count(string s) { string substr = System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0].ToString(); int count = (s.Length - s.Replace(substr, "").Length) / substr.Length; return count; } |
WPF
В WPF проверка имеет два коренных отличия:
- Проверка выполняется при обработке события PreviewTextInput;
- Вводимый символ имеет строковый формат (string). Как следствие используется другая перегрузка метода IsDigit, а при проверке десятичного разделителя необходимо приведение типов.
Ниже приведён код, который разрешает ввод только цифр.
1 2 3 4 |
private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e) { e.Handled = !(Char.IsDigit(e.Text, 0) } |
Ввод десятичных дробей.
1 2 3 4 |
private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e) { e.Handled = !((Char.IsDigit(e.Text, 0) || ((e.Text == System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator[0].ToString()) && (DS_Count(((TextBox)sender).Text)< 1)))); } |
Исходный код метода DS_Count аналогичен приведённому для Windows Forms.
Добавить комментарий