2010-11-17 73 views
6

我有一個winforms複選框綁定到實體框架實體的屬性。文本框/複選框的數據綁定值是不正確的,直到文本框/複選框被驗證

因此,例如,我有bindingSource.DataSource = myDog與綁定到的屬性IsSleeping一個複選框,這樣,當用戶檢查框,IsSleeping爲真,當用戶取消選中複選框,IsSleeping爲假。

這工作正常。問題在於IsSleeping的值只有在複選框被驗證時纔會更新,只有在焦點將遠離從複選框移動到其他位置時纔會發生。因此,如果我想事情發生時沒有選中該複選框:

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

myDog.IsSleeping仍然是真實的,直到複選框的Validated是後來提高。因此,當差myNaughtyKitty(誰在聽DogPropertyChanged事件)來吃myDog的食物盤想着myDog正在睡覺,myDog真的只是醒來! 哦,不!

更糟MyAnimalEntities.SaveChanges()沒有看到變化myDog然而,這樣的IsSleeping值永遠不會保存到數據庫中。移動.SaveChanges()調用IsSleepingCheckbox_Validated不解決這個問題,因爲如果該複選框被觸發,但隨後的形式被關閉而沒有從複選框移動焦點複選框從不驗證,因此它的狀態永遠不會保存!

我想這應該是一個數據綁定和複選框/文本框相當常見的問題,事實上,我已經發現了大量關於這個主題的帖子,但沒有人似乎有過解決方案。 有沒有人能找到解決這個問題的方法?

回答

7

可以更改Binding.DataSourceUpdateMode屬性OnPropertyChanged(默認爲OnValidation),這將導致數據源被更新,當用戶點擊的複選框。不幸的是,CheckedChanged事件在數據源更新之前仍然會觸發。

要解決這個問題,您可以處理BindingSource.ListChanged事件並將您的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

您在谷歌搜索小時之後保存了我的生活。謝謝。 – superjugy 2015-12-23 05:00:17

-1

這是適當的方式來完成這項工作。 處理複選框已驗證事件

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

我在問題中解釋了爲什麼這不起作用 – 2014-07-30 18:57:52