【问题标题】:Databound textbox updates do not persist to db数据绑定文本框更新不会持续到 db
【发布时间】:2015-08-24 21:07:16
【问题描述】:

我有一个 winforms 应用程序,其中包含一组用于实体的文本框,我们将实体称为 Product

我的一个文本框被隐藏了,因为它拥有另一个数据库对象Business Unit 的外键。我使用在父表上查找值的组合框填充隐藏的文本框。 When the selection changes, so does the value in the hidden textbox.

private void businessUnitComboBox_SelectionChangeCommitted(object sender, EventArgs e)
    {
        this.businessUnitIdTextBox.Text = this.businessUnitComboBox.SelectedValue.ToString();

        this.businessUnitComboBox.Focus();
    }

问题是在我的上下文中调用 SaveChanges 后,隐藏文本框上的此更改不会保留。奇怪的是,如果我更新任何其他 Product 文本框,它们会保存得很好。

文本框通过标准拖放从 Visual Studio 的 GUI 添加到项目中,并且在自动添加时创建了绑定源。

我的实体使用 fody-propertychanged 实现 INotifyPropertyChanged。

我很难在这里找到问题。创建新记录工作正常,但更新一个外键值永远不会。

这是因为它是一个导航属性,需要以不同的方式处理,还是有其他可能性来解释为什么不保留更改?非常感谢任何帮助。

【问题讨论】:

  • 我们可以看看你的产品模型类吗?
  • 我能够解决这个问题,直接分配给外键对象而不是外键 ID。 Product 类是 POCO,包含 fody-INotifyPropertyChanged 魔法。但我确实使用 Presenter 作为形式和上下文之间的中介。我现在将 BusinessUnitBindingSource.Current 传递给演示者并设置导航属性而不是 Id。

标签: winforms entity-framework bindingsource fody-propertychanged


【解决方案1】:

可能是因为您的 Save 方法中缺少 this.Validate()。 将此代码放在表单的保存方法中。

this.Validate();
this.yourBindingSource.EndEdit();
yourDbContext.SaveChanges();

数据绑定的默认行为是 OnValidation。

要更改此行为,您可以转到文本框属性,打开数据绑定部分,打开高级,将数据源更新模式更改为 OnPropertyChanged。

所以在设计器生成的代码中你的数据绑定代码将是这样的:

this.nameTextBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.productBindingSource, "Category.Name", true, System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));

在这种情况下,您不需要在保存更改之前使用this.Validate,您可以简单地使用

this.yourBindingSource.EndEdit();
yourDbContext.SaveChanges();

【讨论】:

  • 感谢DataSourceMode的建议和解释。我是该框架的新手,不知道这些配置。不幸的是,添加这些行并没有改变我的情况。我能够直接分配给外键对象而不是外键 ID 来解决这个问题。所以我使用Product.BusinessUnit = BusinessUnitBindingSource.Current 而不是Product.BusinessUnitId = (int)this.businessUnitIdTextBox.Text
猜你喜欢
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 2011-09-22
  • 2015-09-02
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多