c# - usar - selectedindexchanged visual basic
Encienda el comboBox SelectedIndexChanged solo de usuario haga clic (5)
Escribí un método para manejar el evento SelectedIndexChanged de un comboBox.
En el constructor, coloqué el comboBox, y esto activó mi método de manejo de eventos. Que no quiero ya que nadie hizo clic en el comboBox.
¿Hay una manera fácil de hacer que el comboBox no dispare el evento a menos que el usuario haga clic en él?
Si eso no es posible, ¿hay una manera de desconectar el evento al método temporalmente? ¿Podría simplemente configurar "my_combo.SelectedIndexChanged = null" y luego crear un nuevo System.EventHandler?
O supongo que podría crear algún tipo de variable miembro booleana que pueda activar o desactivar y poner una verificación de rama en mi método. Sin embargo, eso parece un chisme.
- Solución: si está rellenando el cuadro combinado con valores estáticos solo unos, simplemente rellénelos y
after
suscríbase al evento desde el código. No utilice WinForms Designer para suscribirse. Si no es posible durante la carga puede:
a) defina una variable booleana
bool loading
, configúrela comotrue
antes de comenzar a rellenar el combo con datos, y en la comprobación del controlador de eventossi (cargando) regreso;
b) Cancelar la suscripción al evento:
Si la suscripción fuera:
comboBox.SelectedIndexChanged + = delegate (...);
La cancelación de la suscripción antes de comenzar a cargar datos es:
comboBox.SelectedIndexChanged - = delegate (...);
Una vez finalizada la carga de datos, suscribirse de nuevo.
Lo he hecho muchas veces. Solución 1: Eliminar EventHandler del diseñador. Rellena el cuadro combinado y luego establece EventHandler.
Combo1.SelectedIndexChanged += new EventHandler Combo1_SelectedIndexChanged;
Pero funcionará solo si está rellenando el cuadro combinado una vez. Si lo hace por muchas veces, entonces puede estar en un lío.
Solución 2: Es mi preferencia y la uso regularmente. Cambie su evento de cambio de selección como:
private void cb1_SelectedIndexChanged(object sender, EventArgs e)
{
ComboBox cb = (ComboBox)sender;
if(!cb.Focused)
{
return;
}
// Here is your Code for selection change
}
Así que ahora el evento se activará solo si está enfocado. Espero que estuvieras buscando lo mismo. Espero eso ayude
No estoy seguro de si esto es de alguna utilidad ahora, pero encontré esta respuesta , que me parece más limpia.
Desde la biblioteca de MSDN - ComboBox.SelectionChangeCommitted Event
" SelectionChangeCommitted se genera solo cuando el usuario cambia la selección del cuadro combinado. No use SelectedIndexChanged o SelectedValueChanged para capturar los cambios del usuario, porque esos eventos también se activan cuando la selección cambia mediante programación".
Puedes usar ambos métodos que propusiste:
- usar variable booleana
desasociar método de eventos, rellenar combobox, adjuntar método de eventos como este
my_combo.SelectedIndexChanged -= my_Combo_SelectedIndexChanged; populateCombo(); my_combo.SelectedIndexChanged += my_Combo_SelectedIndexChanged;
my_Combo_SelectedIndexChanged
es el nombre del método que adjuntó al evento.
Yo usaría control.ContainsFocus en lugar de crear otro bool. La advertencia aquí es que debe asegurarse de que el usuario se centre en ese control. Ya sea por llave o ratón.
if(combo.ContainsFocus){ MyEventLogic();}