【问题标题】:Databound value of textbox/checkbox is incorrect until textbox/checkbox is validated在验证文本框/复选框之前,文本框/复选框的数据绑定值不正确
【发布时间】:2011-05-11 17:40:48
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 在谷歌搜索数小时后,你救了我的命。谢谢。
    【解决方案2】:

    这是完成这项工作的适当方式。 处理 CheckBox Validated 事件

        /// <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);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-27
      • 2019-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多