在validation文本框/复选框之前,文本框/复选框的数据绑定值不正确

我有一个winforms复选框,绑定到Entity Framework实体的属性。

因此,例如,我有一个绑定到属性IsSleeping的checkboxSource.DataSource bindingSource.DataSource = myDog ,因此当用户选中该框时, IsSleeping变为true,当用户取消选中该框时, IsSleeping变为false。

这很好用。 问题是IsSleeping的值在validation复选框之前不会更新,只有当焦点从复选框移到其他位置时才会发生。 因此,如果我想在取消选中该框时发生某些事情:

 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并不能解决这个问题,因为如果复选框被切换但是表单关闭而没有将焦点从复选框移开则复选框永远不会被validation ,因此它的状态永远不会被保存!

我想这对于数据绑定和复选框/文本框来说一定是一个相当常见的问题,事实上我在网上找到了大量关于这个主题的post,但似乎没有人能够找到解决方案。 有没有人能够为此找到解决方法?

您可以将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

这是使这项工作的适当方式。 处理CheckBoxvalidation事件

  ///  /// Handles Check Box State if Changed ///  ///  ///  private void checkBoxBidSummaryItem_Validated(object sender, EventArgs e) { // Code to execute... _MyEntity.Save(_businessObject.SelectedBid); }