Ввод денежной суммы в два поля (Windows Forms)

Иногда в работе приходится сталкиваться с не совсем тривиальной постановкой тривиальных задач. Например, ввести денежную сумму в два поля. То есть, рубли и копейки вводятся в разные поля.

Рассмотрим, как можно решить данную задачу в рамках Windows Forms.

Допустим есть такая форма (см.скриншот), где есть отдельное поле для вода рублей (назовём его rub) и копеек (назовём его kop).

Для начала нам нужно запретить ввод в поле для копеек любых символов, кроме цифр. При этом не должна блокироваться работа клавиши Backspace.

Для этого в обработчик события KeyPress вводится соответствующая проверка.

private void kop_KeyPress(object sender, KeyPressEventArgs e)
{
    e.Handled = !(char.IsDigit(e.KeyChar) || ((int)e.KeyChar == 8));
}

Метод IsDigit проверяет является ли нажатая клавиша цифровой, а цифра 8 соответствует коду клавиши Backspace. На этом подготовка поля для копеек завершена.

В поле для рублей мы используем аналогичную проверку, которая дополнена переходом к вводу в поле копеек после попытки ввода десятичного разделителя.

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 очистить поле для рублей от введённого символа десятичного разделителя.

private void rub_TextChanged(object sender, EventArgs e)
{
    rub.Text = rub.Text.Replace(".", "").Replace(",", "");
}

Задача решена. Теперь мы можем вводить денежную сумму в два поля переключаясь на поле для копеек по нажатию клавиши, соответствующей десятичному разделителю.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *