2009-04-13 22 views
29

¿Cómo puedo desactivar un controlador de eventos temporalmente en WinForms?WinForms: desactivar temporalmente un controlador de eventos

+0

¿Puede compartir lo que está haciendo en un nivel superior? Debido a que probablemente no desee deshabilitar _ALL_ manejadores de eventos (me vienen a la mente los controladores de pintura y movimiento predeterminados del formulario). –

+0

Simplemente no quiero detectar cambios en el estado de un control cuando lo actualizo mediante programación. Y sí, no quiero deshabilitar _ALL_ manejadores de eventos, solo "un manejador de eventos". http://stackoverflow.com/questions/744436/winforms-two-way-textbox-problem – George

Respuesta

47

Probablemente, la forma más sencilla (que no necesita darse de baja o de otro material) es declarar un valor booleano y comprobar que al comienzo del manipulador:

bool dontRunHandler; 

void Handler(object sender, EventArgs e) { 
    if (dontRunHandler) return; 

    // handler body... 
} 
+2

Esto es simple, pero el código será un desastre si usa esto a menudo. – maamaa

40

Desactivar desde qué perspectiva? Si desea eliminar un método que está en su alcance de la lista de delegados en el manejador, puede simplemente hacer ..

object.Event -= new EventHandlerType(your_Method); 

Esto eliminará ese método de la lista de delegados, y se puede recuperarla posteriormente con

object.Event += new EventHandlerType(your_Method); 
+5

Creo que te refieres a tu_Método en lugar de a tu_Método(). A partir de C# 2.0, tampoco necesita la parte "new EventHandlerType", simplemente object.Event + = yourMethod; y object.Event - = yourMethod; –

+0

Sí, quise que fuera sans parens;). Sin embargo, no estaba al tanto de la construcción implícita de delegados; Es bueno saberlo. –

+0

Esta idea funciona para mí (en comparación con la respuesta aceptada) en el escenario en el que necesitaba desactivar el controlador temporalmente para un cuadro combinado EditValueChanged. – PhoenixDev

1

Lo estoy haciendo de esta manera, usando una extensión de control.

public static void SetDatasource(
    this ComboBox cb, 
    object dataSource, 
    EventHandler _SelectedIndexChanged_eventHandler = null, 
    EventHandler _SelectedValueChanged_eventHandler = null) 
{ 
//disable events 
    if (_SelectedIndexChanged_eventHandler != null) cb.SelectedIndexChanged -= _SelectedIndexChanged_eventHandler; 
    if (_SelectedValueChanged_eventHandler != null) cb.SelectedValueChanged -= _SelectedValueChanged_eventHandler; 
    if (cb.InvokeRequired) 
    { 
    cb.BeginInvoke(new _d_SetDatasource_ComboBox(SetDatasource), new object[] { cb, dataSource, _SelectedIndexChanged_eventHandler}); 
    } 
    else 
    { 
    cb.DataSource = dataSource; 
    //events enabled again 
    if (_SelectedIndexChanged_eventHandler != null) cb.SelectedIndexChanged += _SelectedIndexChanged_eventHandler; 
    if (_SelectedValueChanged_eventHandler != null) cb.SelectedValueChanged += _SelectedValueChanged_eventHandler; 
    } 
} 
private delegate void _d_SetDatasource_ComboBox(ComboBox cb, object dataSource, EventHandler _SelectedIndexChanged_eventHandler = null, EventHandler _SelectedValueChanged_eventHandler = null); 
Cuestiones relacionadas