Ищете аккуратный, интуитивно понятный идиоматический способ обрезать значения, которые я установил в элементе управления NumericUpDown, используя C#?

Я использую приведенный ниже код для достижения желаемой функциональности: когда пользователь редактирует значение в конкретном элементе управления NumericUpDown и нажимает либо k, K, m, или же MЯ хочу, чтобы текущая сумма умножалась на 1000, Я также хотел бы избежать любых исключений переполнения. Значения должны автоматически ограничивать minimum и maximum, Я не хотел использовать if заявления, потому что min а также max функции доступны. Но требуется некоторая умственная энергия, чтобы обработать эту логику (применяя min в maximum а также max в minimum... что?), и я чувствовал, что мне нужно оставить комментарий в виде: "Предупреждение, этот код трудно читать, но он работает". Это не тот комментарий, который я должен написать. Логика слишком проста, чтобы нуждаться в комментариях, и все же я не могу найти очевидный способ выразить это. Какие-либо предложения? Могу ли я использовать настройки / методы самого элемента управления, чтобы сделать это?

    private void quantityNumericUpDown_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Control || e.Alt)
        {
            e.Handled = false;
            return;
        }

        if (e.KeyCode != Keys.K && e.KeyCode != Keys.M)
        {
            e.Handled = false;
            return;
        }

        e.SuppressKeyPress = true;
        e.Handled = true;
        this.Quantity *= OneThousand;
    }

    private decimal Quantity
    {
        get
        {
            return this.quantityNumericUpDown.Value;
        }

        set
        {
            // Sorry if this is not the most readable.
            // I am trying to avoid an 'out of range' exception by clipping the value at min and max.
            decimal valClippedUp = Math.Min(value, this.quantityNumericUpDown.Maximum);
            this.quantityNumericUpDown.Value = Math.Max(valClippedUp, this.quantityNumericUpDown.Minimum); 
        }
    }

1 ответ

Напишите это так, и пусть минимальное и максимальное значение элемента управления обновлением будет обрабатывать его для вас.

private void ud_KeyUp(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.K ||
        e.KeyCode == Keys.M)
    {
        e.SuppressKeyPress = true;
        e.Handled = true;
        ud.Value = Math.Max(ud.Minimum, Math.Min(ud.Value * 1000, ud.Maximum));
    }
}
Другие вопросы по тегам