C#设置UserControl.Value而不调用ValueChanged事件

时间:2010-02-09 16:04:42

标签: c# user-controls event-handling

我遇到了无限循环问题。

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

有没有办法在不调用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);
    }
}

3 个答案:

答案 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.
}