2010-11-17 18 views
6

Tengo una casilla de verificación de formas de ganar que está vinculada a una propiedad de una entidad Entity Framework.El valor de databound del cuadro de texto/casilla de verificación es incorrecto hasta que se valide el cuadro de texto/casilla de verificación

Así, por ejemplo, he bindingSource.DataSource = myDog con una casilla de verificación vinculado a la propiedad IsSleeping, de modo que cuando el usuario comprueba la caja, IsSleeping se convierte en verdad, y cuando el usuario desactiva la casilla, IsSleeping se convierte en falsa.

Esto funciona bien. El problema es que el valor de IsSleeping no se actualiza hasta que se valida la casilla de verificación, que solo se produce cuando el foco mueve de distancia de la casilla a otra cosa. Por lo tanto, si quiero algo suceda cuando la caja no está marcada:

private void IsSleepingCheckbox_CheckedChanged(object sender, EventArgs e) 
{ 
    OnDogPropertyChanged(myDog); 
    MyAnimalEntities.SaveChanges(); 
} 

myDog.IsSleeping todavía habrá verdadera, hasta que se levantó después el Validated de casilla de verificación. Por lo tanto, cuando el pobre myNaughtyKitty(que está escuchando el evento DogPropertyChanged) viene a comer fuera de myDog pensando en el plato de comida myDog está durmiendo, myDog ¡está realmente despertando! ¡Oh, no!

Lo que es peor, MyAnimalEntities.SaveChanges() no ve los cambios en myDog sin embargo, por lo que el valor de IsSleeping no se guarda en la base de datos. Mover la llamada .SaveChanges() a IsSleepingCheckbox_Validated no resuelve este problema, ya que si la casilla de verificación se activa pero luego se cierra el formulario sin tener que mover el foco distancia de la casilla de verificación, la casilla de verificación no está validado y por lo tanto su estado no se guarda!

Imagino que este debe ser un problema bastante común con el enlace de datos y las casillas de verificación/cuadros de texto, y de hecho he encontrado un montón de publicaciones sobre el tema en línea, pero nadie parece tener una solución. ¿Alguien ha podido encontrar una solución para esto?

Respuesta

7

Usted puede cambiar la propiedad Binding.DataSourceUpdateMode-OnPropertyChanged (el valor predeterminado es OnValidation), lo que hará que la fuente de datos que se actualiza cuando el usuario hace clic en la casilla de verificación. Desafortunadamente, el evento CheckedChanged todavía se dispara antes de que se actualice la fuente de datos. Para resolver esto, puede manejar el evento BindingSource.ListChanged y mover allí su código SaveChanges.

bindingSource = new BindingSource(); 
bindingSource.DataSource = myDog; 
checkBox1.DataBindings.Add(new Binding("Checked", bindingSource, "IsSleeping")); 
checkBox1.DataBindings[0].DataSourceUpdateMode = DataSourceUpdateMode.OnPropertyChanged; 

bindingSource.ListChanged += new ListChangedEventHandler(bindingSource_ListChanged); 

HTH

+0

has salvado la vida después de horas de búsqueda en Google. Gracias. – superjugy

-1

Ésta es la manera adecuada para hacer este trabajo. Manejar la casilla de verificación Validado Evento

/// <summary> 
    /// Handles Check Box State if Changed 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void checkBoxBidSummaryItem_Validated(object sender, EventArgs e) 
    { 
     // Code to execute... 
     _MyEntity.Save(_businessObject.SelectedBid); 
    } 
+0

Le expliqué en la pregunta por qué esto no funciona –

Cuestiones relacionadas