仅限用户交互的NumericUpDown事件

时间:2015-05-04 13:06:27

标签: c# forms winforms events numericupdown

我的表单中有3个NumericUpDown个元素。这些元素按其总和进行同步。例如,sum是9个元素值是3,3,3,增量是2.当用户从第3个元素更改为第3个元素时,我们必须得到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;
        }
    }

我想使用事件,当用户点击向上或向下按钮时,或者用户输入新值时有效。

我必须选择哪种活动?

1 个答案:

答案 0 :(得分:2)

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

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

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