2009-11-02 13 views
8

No obtengo el comportamiento que esperaría de un TextBox vinculado a una propiedad entera en un objeto comercial.Cancelar el evento de validación del control de datos no suprime el intento de actualizar el origen de datos

Aquí es lo que hice:

(1) Establecer la DataSourceUpdateMode, para el cuadro de texto a: OnValidation.

(2) En el evento Validating para TextBox, establezca e.Cancel = True si falla Integer.TryParse.

(3) Agregue un controlador a Binding.Parse y Binding.BindingComplete y coloque puntos de interrupción en los controladores.

Ejecute la aplicación, coloque "asdasd" en el TextBox y tab out. A pesar de la configuración e.Cancel = True, los Parse y BindingComplete eventos son ambas elevadas. Según la documentación, el establecimiento de e.Cancel = True debe suprimir cualquier lógica adicional.

Busqué en MSDN para averiguar por qué sucede esto pero no puedo encontrar nada. ¿Alguien sabe de dónde puedo obtener algunos detalles sobre esto?

ETA: Agregué un identificador para el evento validado también. Aquí está la secuencia de eventos:

datos erróneos:

(1) validar. (I puse e.Cancel = True)

(2) analizar

(3) BindingComplete

Bueno datos:

(1) Validar

(2) Parse

(3) BindingComplete

(4) Validado

ETA2: Un poco más de información y una solución alternativa.

El problema con este comportamiento es si tiene alguna validación que no está implementada en el conjunto de propiedades.

Por ejemplo, digamos que mi propiedad número entero tiene que ser un número impar. No comprobar esto en la incubadora propiedad, por lo que hago el cheque en caso de validación.

Como puede ver, a partir del comportamiento anterior, el valor, como un número entero legítimo, se escribirá en el origen de datos, incluso si cancelo la validación.

A pesar de que la fuente de datos se actualiza, si establece Cancelar en el evento de validación, el evento Validado no se disparará, por lo que aún puede evitar que el usuario progrese.

trabajo en torno ::

Para detener la actualización fuente de datos, es necesario validar en caso Binding.Parse, y lanzar una excepción - la cual previene la unión de completar con éxito.

+0

buen encontrar. [Parece un error de winforms] [1]. [1]: http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=490267 –

+0

Saludos, he votado el error y he agregado un trabajo. – Jules

Respuesta

1

Agregando una llamada a CancelEdit parece hacer la diferencia.

private void textBox1_Validating(object sender, CancelEventArgs e) 
    { 
     bindingSource1.CancelEdit(); 
     e.Cancel = true; 
    } 
+0

La próxima vez comprobaré en qué año se publicó la pregunta en .... – helgeheldre

Cuestiones relacionadas