Blu*_*eft 6 .net c# data-binding entity-framework winforms
我有一个winforms复选框,绑定到Entity Framework实体的属性.
因此,例如,我有bindingSource.DataSource = myDog一个绑定到属性的复选框IsSleeping,以便当用户选中该框时,IsSleeping变为true,并且当用户取消选中该框时,IsSleeping将变为false.
这很好用.问题是,价值IsSleeping不更新,直到该复选框被验证,只有当焦点发生移动远离从复选框别的东西.因此,如果我想在取消选中该框时发生某些事情:
private void IsSleepingCheckbox_CheckedChanged(object sender, EventArgs e)
{
OnDogPropertyChanged(myDog);
MyAnimalEntities.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
myDog.IsSleeping仍然是真的,直到Validated稍后提出复选框.因此,当穷人myNaughtyKitty (谁正在听这个DogPropertyChanged事件)来吃饭时,myDog想着myDog睡觉的食物菜,myDog真的只是醒来! 不好了!
更糟糕的是,MyAnimalEntities.SaveChanges()还没有看到更改myDog,因此值IsSleeping永远不会保存到数据库中.移动.SaveChanges()呼叫IsSleepingCheckbox_Validated并不能解决这个问题,因为如果复选框被切换但是表格被关闭而没有将焦点移离复选框,则复选框永远不会被验证,因此它的状态永远不会被保存!
我想这对于数据绑定和复选框/文本框来说一定是一个相当常见的问题,事实上我在网上发现了大量关于这个主题的帖子,但似乎没有人有过解决方案. 有没有人能够为此找到解决方法?
您可以将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);
Run Code Online (Sandbox Code Playgroud)
HTH
| 归档时间: |
|
| 查看次数: |
3373 次 |
| 最近记录: |