我遇到了无限循环问题。
我有两个数字上/下控制(高度和宽度输入参数)。当用户更改其中一个控件的值时,我需要缩放另一个控件以保持高宽比不变。
有没有办法在不调用ValueChanged事件的情况下设置控件的值。我只希望在用户更改值时执行ValueChanged事件。
private void FloorLength_ValueChanged(object sender, EventArgs e)
{
if (this.mCurrentDocument.System.SuperTrakSystem.FloorBitmap != null)
{
FloorWidth.Value = FloorLength.Value *
((decimal)this.mCurrentDocument.System.SuperTrakSystem.FloorBitmap.Height /
(decimal)this.mCurrentDocument.System.SuperTrakSystem.FloorBitmap.Width);
}
}
private void FloorWidth_ValueChanged(object sender, EventArgs e)
{
if (this.mCurrentDocument.System.SuperTrakSystem.FloorBitmap != null)
{
FloorLength.Value = FloorWidth.Value *
((decimal)this.mCurrentDocument.System.SuperTrakSystem.FloorBitmap.Width /
(decimal)this.mCurrentDocument.System.SuperTrakSystem.FloorBitmap.Height);
}
}
答案 0 :(得分:6)
感谢您的回答。
我想出了一个有效的替代解决方案。用户从UI更改值会触发事件,而程序化值参数更改不会触发事件。
using System;
using System.Windows.Forms;
namespace myNameSpace.Forms.UserControls
{
public class NumericUpDownSafe : NumericUpDown
{
EventHandler eventHandler = null;
public event EventHandler ValueChanged
{
add
{
eventHandler += value;
base.ValueChanged += value;
}
remove
{
eventHandler -= value;
base.ValueChanged -= value;
}
}
public decimal Value
{
get
{
return base.Value;
}
set
{
base.ValueChanged -= eventHandler;
base.Value = value;
base.ValueChanged += eventHandler;
}
}
}
}
答案 1 :(得分:5)
我不熟悉NumericUpDown控件,但可能没有办法在不触发ValueChanged事件的情况下设置值。相反,在设置值之前,您可以设置一个标志,指示应忽略该事件,并在设置值后清除该标志。在事件处理程序中,如果设置了标志,则不执行任何操作。
private bool ignoreEvent = false;
private void setValue(int value)
{
ignoreEvent = true;
FloorLength.Value = value;
ignoreEvent = false;
}
private void FloorLength_ValueChanged(object sender, EventArgs e)
{
if(ignoreEvent) { return; }
// your code here
}
答案 2 :(得分:1)
理论上,这些值应该稳定...意思是如果用户改变1,系统改变另一个,然后第一个保持不变。因此,我只需要检查两个事件处理程序(伪代码):
newValue = equation;
if(controlValue != newValue)
{
controlValue = newValue; //raises the event only when necessary.
}