Ищете аккуратный, интуитивно понятный идиоматический способ обрезать значения, которые я установил в элементе управления 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));
}
}