2010-07-28 15 views
7

Mi aplicación C# tiene un comboBox con un evento SelectedIndexChanged. Por lo general, quiero que este evento se dispare, pero a veces necesito que el evento no se dispare. Mi comboBox es una lista de archivos MRU. Si se encuentra que un archivo en la lista no existe, el elemento se elimina del comboBox y el comboBoxSelectedIndex se establece en cero. Sin embargo, al establecer comboBoxSelectedIndex en cero, se desencadena el evento SelectedIndexChanged, que en este caso es problemático porque hace que se ejecute algún código UIF en el controlador de eventos. ¿Existe alguna forma elegante de deshabilitar/habilitar eventos para los controles de formulario C#? Gracias.Modificación de SelectedIndex de ComboBox sin evento desencadenante en C#

Respuesta

11

iniciar el método manejador de sucesos con

ComboBox combo = sender as ComboBox; 
if (combo.SelectedIndex == 0) 
{ 
    return; 
} 

Si eres problema es con un manejador de sucesos diferentes se podía quitar el registro de eventos de la primera eventhandler.

combo.SelectedIndexChanged -= EventHandler<SelectedIndexChangedEventArgs> SomeEventHandler; 
combo.SelectedIndex = 0; 
combo.SelectedIndexChanged += EventHandler<SelectedIndexChangedEventArgs> SomeEventHandler; 
1

Una forma (bastante feo) sería la de establecer un indicador en el código que elimina la entrada y luego comprobar que en el SelectedIndexChanged manejador:

if (!deletedEntry) 
{ 
    // Do stuff 
} 
deletedEntry = false; 

Una mejor manera podría ser la eliminación de su SelectedIndexChanged controlador de eventos al comienzo del método de eliminación y reinícielo al final. De esta forma su código no sabrá que el índice ha cambiado.

8

He encontrado esto muchas veces a lo largo de los años. Mi solución es tener una variable de nivel de clase llamada _noise y si sé que estoy a punto de cambiar el índice de combo o cualquier otro control similar que se active cuando cambie el índice seleccionado, hago lo siguiente en el código.

private bool _noise; 

Este es el código del controlador de eventos de control

private void cbTest_SelectedIndexChange(object sender, EventArgs e) 
{ 
    if (_noise) return; 

    // process the events code 

    ... 

} 


Entonces cuando sé que voy a cambiar el índice, hago lo siguiente:

_noise = true; // cause the handler to ignore the noise... 


cbTest.Index = value; 


_noise = false; // let the event process again 
3

Me sorprende que no haya una mejor manera de hacerlo, pero esta es la forma en que lo hago. De hecho, utilizo el campo Tag de la mayoría de los controles, así que no tengo que subclasificar el control. Y uso true/null como los valores, ya que null es el valor predeterminado.

Por supuesto, si usted está utilizando realmente Tag, tendrá que hacerlo de manera diferente ...

En manejador:

private void control_Event(object sender, EventArgs e) 
{ 
    if (control.Tag != null) return; 

    // process the events code 

    ... 

} 

En código principal

try 
{ 
    control.Tag = true; 
    // set the control property 
    control.Value = xxx; 
or 
    control.Index = xxx; 
or 
    control.Checked = xxx; 
    ... 
} 
finally 
{ 
    control.Tag = null; 
} 
Cuestiones relacionadas