Иногда в работе приходится сталкиваться с не совсем тривиальной постановкой тривиальных задач. Например, ввести денежную сумму в два поля. То есть, рубли и копейки вводятся в разные поля.
Рассмотрим, как можно решить данную задачу в рамках Windows Forms.
Допустим есть такая форма (см.скриншот), где есть отдельное поле для вода рублей (назовём его rub) и копеек (назовём его kop).
Для начала нам нужно запретить ввод в поле для копеек любых символов, кроме цифр. При этом не должна блокироваться работа клавиши Backspace.
Для этого в обработчик события KeyPress вводится соответствующая проверка.
1 2 3 4 |
private void kop_KeyPress(object sender, KeyPressEventArgs e) { e.Handled = !(char.IsDigit(e.KeyChar) || ((int)e.KeyChar == 8)); } |
Метод IsDigit проверяет является ли нажатая клавиша цифровой, а цифра 8 соответствует коду клавиши Backspace. На этом подготовка поля для копеек завершена.
В поле для рублей мы используем аналогичную проверку, которая дополнена переходом к вводу в поле копеек после попытки ввода десятичного разделителя.
1 2 3 4 5 6 7 8 9 10 11 |
private void rub_KeyPress(object sender, KeyPressEventArgs e) { if ((e.KeyChar == '.') || (e.KeyChar == ',')) { kop.Focus(); } else { e.Handled = !(char.IsDigit(e.KeyChar) || ((int)e.KeyChar == 8)); } } |
Помимо приведённого выше способа, есть возможность получить информацию о десятичном разделителе на основании используемой раскладки клавиатуры. Но, реализация в таком случае будет гораздо более громоздкой и в силу специфики задачи, это скорее всего будет излишним усложнением программы.
Теперь остаётся только в событии TextChanged очистить поле для рублей от введённого символа десятичного разделителя.
1 2 3 4 |
private void rub_TextChanged(object sender, EventArgs e) { rub.Text = rub.Text.Replace(".", "").Replace(",", ""); } |
Задача решена. Теперь мы можем вводить денежную сумму в два поля переключаясь на поле для копеек по нажатию клавиши, соответствующей десятичному разделителю.
Добавить комментарий