Почему событие ValueChanged не запускается в элементе управления NumericUpDown при изменении значения вручную?

У меня есть код, прикрепленный к событию ValueChanged двух элементов управления NumericUpDown:

private void numericUpDownHeight_ValueChanged(object sender, EventArgs e)
{
    if (checkBoxRetainRatio.Checked)
    {
        numericUpDownWidth.Value = numericUpDownHeight.Value;
    }
}

private void numericUpDownWidth_ValueChanged(object sender, EventArgs e)
{
    if (checkBoxRetainRatio.Checked)
    {
        numericUpDownHeight.Value = numericUpDownWidth.Value;
    }
}

Это прекрасно работает, когда я использую стрелки вверх/вниз элементов управления, чтобы изменить значение в поле редактирования; но если я отредактирую значение вручную (например, когда я хочу изменить его со 100 на 25 и могу сделать это вручную за шесть нажатий клавиш, тогда как при увеличении на 5 потребуется 15 с помощью стрелки вниз), событие не срабатывает .

Есть ли быстрый способ исправить это довольно незначительное раздражение (IOW, если для этого потребуется что-то действительно загадочное и сложное, я не буду беспокоиться).


person B. Clay Shannon    schedule 19.03.2015    source источник
comment
возможный дубликат: Событие TextChanged NumericUpDown   -  person S.Serpooshan    schedule 13.03.2017


Ответы (2)


Чтобы произошло событие ValueChanged, свойство Value можно изменить в коде, нажав кнопку вверх или вниз или введя новое значение, которое считывается элементом управления. Новое значение считывается, когда пользователь нажимает клавишу ВВОД или уходит от элемента управления. Если пользователь вводит новое значение, а затем нажимает кнопку вверх или вниз, событие ValueChanged произойдет дважды.

Источник: https://msdn.microsoft.com/en-us/library/system.windows.forms.numericupdown.valuechanged%28v=vs.110%29.aspx

person user700390    schedule 19.03.2015
comment
По сути, если вы хотите получить действующее значение, пока использование все еще печатает, вы действительно хотите зарегистрироваться для события TextChanged и самостоятельно проанализировать значение. - person Anthony; 19.03.2015
comment
@Anthony Я бы даже предположил, что, если идти по этому маршруту, когда срабатывает событие TextChanged, вы должны установить / сбросить таймер, а затем проанализировать значение по истечении таймера. Таким образом, если пользователь вводит несколько символов, вы не будете выполнять синтаксический анализ, пока он не закончит ввод. - person user700390; 19.03.2015
comment
Полностью согласен, определенно ситуация «Как глубоко в кроличьей норе вы хотите сделать». - person Anthony; 19.03.2015

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

Для компонента numericUpDown:

((System.Windows.Forms.NumericUpDown)(sender)).Value.ToString()
person JrBriones    schedule 13.02.2018