NumericUpDown 事件仅用于用户交互

Event to NumericUpDown for only user interaction

我的表单中有 3 个 NumericUpDown 元素。该元素通过它们的总和同步。例如,总和是 9 个元素,值是 3、3、3,增量是 2。当用户将第一个元素从 3 更改为 5 时,我们必须得到 5、2、2。

对于同步,我曾尝试使用事件 ValueChangedVisibleChanged,但它们在我们进行编程修改或用户交互时起作用。 我对每个元素都使用了这个方法,但是对于这个事件,当代码中其他元素的结果值发生变化时,这个方法又开始改变了。

 private void numericUpDown1Change(object sender, EventArgs e)
    {
        int oldValue = Sum - (int)numericUpDown2.Value - (int)numericUpDown3.Value;
        int average;
        if ((int)numericUpDown1.Value - oldValue > 0)
        {
            average = ((int)numericUpDown1.Value - oldValue) / 2;
            numericUpDown2.Value = numericUpDown2.Value - average;
            numericUpDown3.Value = numericUpDown3.Value - average;
        }
        else
        {
            average = (oldValue - (int)numericUpDown1.Value) / 2;
            numericUpDown2.Value = numericUpDown2.Value + average;
            numericUpDown3.Value = numericUpDown3.Value + average;
        }
    }

我想使用事件,当用户单击向上或向下按钮或用户输入新值时起作用的事件。

我必须选择什么事件?

使用 ValueChanged 事件,但保留一个标志,告诉您更改是由代码还是用户完成的。

对于单个控件,您可以将布尔变量保持在 class 级别(我可能将其称为 IsValueChangedByCode)并将其设置为 false。在您的方法中,就在您更改值之前,将其设置为 true,然后立即返回 false。在事件处理程序中检查标志是 true 还是 false,然后决定是否要执行代码。

对于 3 个控件,逻辑是相同的,但不是使用布尔标志,而是需要 2 个不同的布尔值,或者您可以使用整数或标志枚举。