visual valor sea que programar hacer evitar escribir escriban ejemplos editable como c# winforms combobox

sea - ¿Cómo prevenir/cancelar el cambio de valor de un combobox en c#?



no escribir en combobox c# (7)

Tengo un cuadro combinado en la parte superior de un formulario que carga datos editables en los campos a continuación. Si el usuario ha realizado cambios, pero no se ha guardado, e intenta seleccionar una opción diferente del cuadro combinado, quiero advertirles y darles la oportunidad de cancelar o guardar.

Necesito un evento "BeforeValueChange" con un argumento de evento cancelable.

¿Algún consejo sobre cómo lograrlo?


¿Qué le parece usar los eventos Validating / Validated?
Funciona bien, si el evento que sucede en LostFocus en lugar de Change está bien con usted.

De lo contrario, ¿qué tal

public void Combobox_ValueChanged(object sender, EventArgs e) { if (!AskUserIfHeIsSureHeWantsToChangeTheValue()) { // Set previous value return; } // perform rest of onChange code }



Guarde el valor actual en el evento Enter . Implemente la lógica BeforeValueChange en el evento ValueChanged , antes de la lógica ValueChanged real. Si el usuario cancela, configure el valor almacenado y no continúe en el método ( return ).

Si vas a utilizar mucho este sistema, te sugiero heredar ComboBox e implementar allí tu evento BeforeValuechange .


No obtienes un evento apropiado por defecto. Puede almacenar en caché el valor anterior y configurarlo de nuevo si el usuario desea cancelar.


Podría usar un filtro de mensajes para interceptar clics y presionar teclas, lo que le permitiría evitar el comportamiento normal del cuadro combinado. Pero creo que será mejor que deshabilite el cuadro combinado cuando el usuario realice un cambio y solicite que guarden o reviertan sus cambios.


Aquí está la solución más simple:

bool isSelectionHandled = true; void CmbBx_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (isSelectionHandled) { MessageBoxResult result = MessageBox.Show("Do you wish to continue selection change?", this.Title, MessageBoxButton.YesNo, MessageBoxImage.Question); if (result == MessageBoxResult.No) { ComboBox combo = (ComboBox)sender; isSelectionHandled = false; if (e.RemovedItems.Count > 0) combo.SelectedItem = e.RemovedItems[0]; return; } } isSelectionHandled = true; }


Guarde el SelectedIndex de ComboBox cuando se ingrese por primera vez, y luego restaure su valor cuando necesite cancelar el cambio.

cbx_Example.Enter += cbx_Example_Enter; cbx_Example.SelectionChangeCommitted += cbx_Example_SelectionChangeCommitted; ... private int prevExampleIndex = 0; private void cbx_Example_Enter(object sender, EventArgs e) { prevExampleIndex = cbx_Example.SelectedIndex; } private void cbx_Example_SelectionChangeCommitted(object sender, EventArgs e) { // some custom flag to determine Edit mode if (mode == FormModes.EDIT) { cbx_Example.SelectedIndex = prevExampleIndex; } }