C#在不调用ValueChanged事件的情况下设置UserControl.Value

C#在不调用ValueChanged事件的情况下设置UserControl.Value,c#,user-controls,event-handling,C#,User Controls,Event Handling,我遇到了一个无限循环问题 我有两个数字上/下控件(高度和宽度输入参数)。当用户更改其中一个控件的值时,我需要缩放另一个控件以保持高宽比恒定 是否有一种方法可以在不调用ValueChanged事件的情况下设置控件的值。我只希望在用户更改值时执行ValueChanged事件 private void FloorLength_ValueChanged(object sender, EventArgs e) { if (this.mCurrentDocument.System.SuperTrak

我遇到了一个无限循环问题

我有两个数字上/下控件(高度和宽度输入参数)。当用户更改其中一个控件的值时,我需要缩放另一个控件以保持高宽比恒定

是否有一种方法可以在不调用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);
    }
}

我对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
}

理论上,这些值应该稳定。。。这意味着如果用户更改1,系统将更改另一个,然后第一个将保持不变。因此,我只想在两个事件处理程序(伪代码)中添加一个检查:


谢谢你的回答

我想出了一个可行的替代方案。用户从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;
            }
        }
    }
}

它们不稳定,我认为这是因为值被四舍五入到小数点后两位。那么,我们能获得关于值(一两个示例)和数字上下属性(例如小数点)的更多信息吗?
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;
            }
        }
    }
}