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