2010-11-17 4 views
6

J'ai une case à cocher winforms liée à une propriété d'une entité Entity Framework.La valeur de la zone de texte/case à cocher est incorrecte jusqu'à ce que la zone de texte/case à cocher soit validée

Ainsi, par exemple, j'ai bindingSource.DataSource = myDog avec une case à cocher liée à la propriété IsSleeping, de sorte que lorsque l'utilisateur vérifie la boîte, IsSleeping devient vrai, et lorsque l'utilisateur désélectionne la boîte, IsSleeping devient fausse.

Cela fonctionne très bien. Le problème est que la valeur de IsSleeping n'est pas mise à jour tant que la case à cocher n'est pas validée, ce qui se produit uniquement lorsque le focus déplace de de la case à cocher vers autre chose. Ainsi, si je veux quelque chose à se produire lorsque la case est décochée:

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

myDog.IsSleeping sera toujours vrai, plus tard est soulevé Validated de la case à cocher. Ainsi, quand pauvre myNaughtyKitty(qui écoute l'événement DogPropertyChanged) vient manger à myDog plat de nourriture myDog est en train de dormir, myDog est vraiment juste se réveiller! Oh non!

Pire encore, MyAnimalEntities.SaveChanges() ne voit pas les changements à myDog encore, la valeur de IsSleeping est jamais sauvé à la base de données. Déplacer l'.SaveChanges() appel à IsSleepingCheckbox_Validated ne résout pas ce problème, car si la case est cochée mais le formulaire est fermé sans jamais se déplacer loin de la case à cocher, la case à cocher n'est jamais validée et donc son état n'est jamais enregistré! J'imagine que cela doit être un problème assez commun avec la connexion de données et les cases à cocher/textboxes, et en effet j'ai trouvé une tonne de messages sur le sujet en ligne, mais personne ne semble jamais avoir une solution. Est-ce que quelqu'un a été en mesure de trouver une solution de contournement pour cela?

Répondre

7

Vous pouvez modifier la propriété Binding.DataSourceUpdateMode-OnPropertyChanged (la valeur par défaut est OnValidation), ce qui entraînera la source de données à jour lorsque l'utilisateur clique sur la case à cocher. Malheureusement, l'événement CheckedChanged se déclenche toujours avant la mise à jour de la source de données. Pour traiter cela, vous pouvez gérer l'événement BindingSource.ListChanged et y déplacer votre code 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

Tu as sauvé ma vie après des heures de recherche dans google. Merci. – superjugy

-1

Ceci est la façon appropriée de faire ce travail. Manipulez le CheckBox Validé événement

/// <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

J'ai expliqué dans la question pourquoi cela ne fonctionne pas –

Questions connexes