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
}
El evento Validating se puede usar para este escenario
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx
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;
}
}