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

Я использую приведенный ниже код для достижения желаемой функциональности: когда пользователь редактирует значение в конкретном элементе управления NumericUpDown и нажимает k, K, m или M, I хотите, чтобы текущая введенная сумма умножалась на 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 Ответ

0 голосов
/ 09 августа 2011

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

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));
    }
}
...