C # set UserControl.Value без вызова события ValueChanged - PullRequest
8 голосов
/ 09 февраля 2010

Я столкнулся с проблемой бесконечного цикла.

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

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

6 голосов
/ 09 февраля 2010

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

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

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;
            }
        }
    }
}
5 голосов
/ 09 февраля 2010

Я не очень знаком с элементом управления 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 голос
/ 09 февраля 2010

Теоретически, эти значения должны стабилизироваться ... То есть, если пользователь меняет 1, система меняет другой, а затем первый остается прежним. Поэтому я бы просто добавил проверку в оба обработчика событий (псевдокод):

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