2010-11-17 39 views
6

Ho una casella di controllo Winforms associata a una proprietà di un'entità Entity Framework.Il valore del database della casella di testo/casella di spunta non è corretto finché la casella di testo/casella di controllo non è convalidata

Così, per esempio, ho bindingSource.DataSource = myDog con una casella di controllo legati alla proprietà IsSleeping, in modo che quando l'utente controlla la casella, IsSleeping diventa vero, e quando l'utente deseleziona la casella, IsSleeping diventa falso.

Questo funziona correttamente. Il problema è che il valore di IsSleeping non viene aggiornato fino a quando la casella di controllo non viene convalidata, che si verifica solo quando lo stato attivo sposta da dalla casella di controllo a qualcos'altro. Così, se voglio che accada qualcosa quando la casella è selezionata:

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

myDog.IsSleeping sarà ancora vero, fino a quando la casella di controllo del Validated viene poi sollevato. Così, quando il povero myNaughtyKitty(chi sta ascoltando l'evento DogPropertyChanged) viene a mangiare fuori dal piatto di cibo myDog pensando che myDog stia dormendo, myDog si sta proprio svegliando! Oh no!

Ancora peggio, MyAnimalEntities.SaveChanges() non vede le modifiche al myDog ancora, quindi il valore di IsSleeping non è mai salvate nel database. Spostare la chiamata .SaveChanges() a IsSleepingCheckbox_Validated non risolve questo problema, perché se la casella di controllo è attivata ma il modulo viene chiuso senza mai spostare lo stato attivo da dalla casella di controllo, la casella di controllo non viene mai convalidata e quindi il suo stato non viene mai salvato!

Immagino che questo deve essere un problema abbastanza comune con l'associazione di dati e caselle di controllo/caselle di testo, e infatti ho trovato un sacco di post sull'argomento online, ma nessuno sembra mai avere una soluzione. Qualcuno è stato in grado di trovare una soluzione alternativa per questo?

risposta

7

È possibile modificare la proprietà Binding.DataSourceUpdateMode-OnPropertyChanged (il valore predefinito è OnValidation), che farà sì che l'origine dati per essere aggiornato quando l'utente fa clic sulla casella di controllo. Sfortunatamente, l'evento CheckedChanged si attiva ancora prima che l'origine dati venga aggiornata.

Per far fronte a questo, è possibile gestire l'evento BindingSource.ListChanged e spostare il codice SaveChanges lì.

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

Mi hai salvato la vita dopo ore di ricerca in google. Grazie. – superjugy

-1

Questo è il modo appropriato per fare questo lavoro. Gestire l'evento convalidato CheckBox

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

Ho spiegato nella domanda perché questo non funziona –

Problemi correlati