2008-11-24 10 views
22

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.¿Cómo prevenir/cancelar el cambio de valor de un combobox en C#?

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

¿Algún consejo sobre cómo lograrlo?

Respuesta

0

Puede usar message filter 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.

2

El evento de validación puede ser utilizado para este escenario
http://msdn.microsoft.com/en-us/library/system.windows.forms.control.validating.aspx

+2

Esto sucede después de que se pierde el foco, por lo que no va a funcionar. Necesito un evento que ocurre "antes" de que el usuario intente cambiar el valor. –

+0

@RG: ¿no podría simplemente volver a poner el foco en el cuadro combinado o hay algún proceso que sucede cuando pierde el foco? –

1

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

3

Guarde el valor actual en el evento Enter. Implemente la lógica BeforeValueChange en el evento ValueChanged, antes de la lógica real ValueChanged. 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 tu evento BeforeValuechange ahí.

1

¿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é hay de

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

    // perform rest of onChange code 
} 
16

Guardar SelectedIndex del ComboBox cuando a la caja si se ha introducido en primer lugar, y luego restaurar su valor cuando es necesario para 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; 
    } 
} 
+0

Así es como siempre lo he hecho, y funciona como se esperaba. –

+1

Esta es una solución perfecta en lugar de un evento SelectionChanging. ¡¡Gracias!! - Matthew –

+2

No es necesario utilizar el evento 'Enter' para guardar la última selección. Simplemente guarde un valor 'lastSelectedIndex' como una variable' private', antes de salir del controlador de eventos 'SelectionChangeCommitted'. A partir de entonces, las entradas posteriores en ese controlador de eventos pueden usar 'lastSelectedIndex' para establecer' ComboBox.SelectedIndex' en la posición anterior. –

4

Aquí es 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; 
     } 
+0

¿Qué es este evento 'SelectionChanged'? Es de WinForm ComboBox. – i486

Cuestiones relacionadas