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

时间:2010-11-17 22:57:37

标签: c# .net winforms entity-framework data-binding

我有一个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}}并不能解决此问题,因为如果切换复选框但是表单已关闭而没有从复选框中移开焦点永远不会验证复选框,因此永远不会保存其状态!

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

2 个答案:

答案 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);
    }