C# установить UserControl.Значение без вызова события ValueChanged

я сталкиваюсь с проблемой бесконечного цикла.

У меня есть два числовых элемента управления вверх/вниз (входные параметры высоты и ширины). Когда пользователь изменяет значение одного из элементов управления, мне нужно масштабировать другой, чтобы сохранить отношение высоты к ширине постоянным.

есть ли способ, чтобы установить значение элемента управления без вызова события 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 ответов


Спасибо за ваши ответы.

Я придумал альтернативное решение, которое работает. Пользователь, изменяющий значение из пользовательского интерфейса, запускает событие, в то время как изменения параметров программного значения не запускают событие.

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;
            }
        }
    }
}

Я не так хорошо знаком с элементом управления 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, система изменяет другой, а затем первый остается прежним. Поэтому я бы просто добавил проверку в оба обработчика событий (псевдокод):

newValue = equation;
if(controlValue != newValue)  
{
    controlValue = newValue; //raises the event only when necessary.
}