我有一个winforms复选框,该复选框绑定到Entity Framework实体的属性。
例如,我bindingSource.DataSource = myDog
有一个绑定到属性IsSleeping
的复选框,因此当用户选中该框时,IsSleeping
变为true,当用户取消选中时框,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
调用转移到{{1}}并不能解决此问题,因为如果切换复选框但是表单已关闭而没有从复选框中移开焦点远,永远不会验证复选框,因此永远不会保存其状态!
我想这对于数据绑定和复选框/文本框来说一定是一个相当普遍的问题,事实上我在网上找到了大量关于这个主题的帖子,但似乎没有人能找到解决方案。 是否有人能够为此找到解决方法?
答案 0 :(得分:8)
您可以将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
答案 1 :(得分:-1)
这是使这项工作适当的方法。 处理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);
}