我的表单中有3个NumericUpDown
个元素。这些元素按其总和进行同步。例如,sum是9个元素值是3,3,3,增量是2.当用户从第3个元素更改为第3个元素时,我们必须得到5,2,2。
对于已同步,我曾尝试使用事件ValueChanged
和VisibleChanged
,但是当我们进行程序化修改或用户交互时,它们会正常工作。
我为每个元素使用了这个方法,但是对于这个事件,当方法中其他元素的结果值发生变化时,此方法会再次开始更改。
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;
}
}
我想使用事件,当用户点击向上或向下按钮时,或者用户输入新值时有效。
我必须选择哪种活动?
答案 0 :(得分:2)
使用ValueChanged
事件,但请保留一个标记,告诉您更改是由代码还是由用户完成的。
对于单个控件,您可以在类级别保留一个布尔变量(我可能将其称为IsValueChangedByCode
)并将其设置为false
。在您的方法内部,在更改值之前,将其设置为true
,然后将其设置为false
。在事件处理程序内部检查该标志是true
还是false
,并决定是否要执行代码。
对于3个控件,逻辑是相同的,但不是使用布尔标志,而是需要2个不同的布尔值,或者你可以使用整数或标志枚举。