2010-02-09 10 views
6

Me encuentro con un problema de bucle infinito.C# establece UserControl.Value sin invocar el evento ValueChanged

Tengo dos controles numéricos arriba/abajo (parámetros de entrada de altura y ancho). Cuando el usuario cambia el valor de uno de los controles, necesito escalar el otro para mantener una relación de altura a ancho constante.

Hay una manera de establecer el valor de un control sin invocar un evento ValueChanged. Solo quiero que el evento ValueChanged se ejecute cuando el usuario cambie el valor.

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

Respuesta

5

Gracias por su respuesta.

Se me ocurrió una solución alternativa que funciona. El usuario que cambia el valor de la interfaz de usuario desencadena el evento, mientras que los cambios del parámetro de valor programático no desencadenan el evento.

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Windows.Forms; 

namespace myNameSpace.Forms.UserControls 
{ 
    public class NumericUpDownSafe : NumericUpDown 
    { 
     private bool bypassEvent = false; 
     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; 
      } 
     } 
    } 
} 
+0

me gusta esta solución – David

4

no estoy tan familiarizado con el control NumericUpDown, pero puede que no haya una manera de establecer el valor sin que se dispare el evento ValueChanged. En su lugar, antes de establecer el valor, puede establecer un indicador que indique que se debe ignorar el evento y borrar el indicador después de establecer el valor. En su controlador de eventos, no haga nada si la bandera está configurada.

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

En teoría, estos valores deberían estabilizarse ... Es decir, si el usuario cambia 1, el sistema cambia al otro y luego el primero sigue siendo el mismo. Por lo tanto, simplemente agregaría un cheque en ambos manejadores de eventos (pseudocódigo):

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

que no se estabilizan, yo creo que es porque los valores se redondean a dos decimales – Kevin

+0

Por lo tanto, podemos conseguir más información sobre los valores (un ejemplo o dos) y las propiedades NumericUpDown (por ejemplo LugaresDecimales) ? –

Cuestiones relacionadas