【问题标题】:Windows Forms: Refresh Bindings works only for added items not for updated onesWindows 窗体:刷新绑定仅适用于添加的项目,不适用于更新的项目
【发布时间】:2012-01-05 16:01:25
【问题描述】:

我想创建一个撤消按钮:

private void btn_Undo_Click(object sender, EventArgs e)
{
    m_storesBS.DataSource = _storeRepository.GetAll();
    StoresBindingNavigator.BindingSource.ResetBindings(false);
}

这很好用,当我添加一个项目然后按下撤消按钮时。

但是,如果我通过更改文本框值来编辑项目并按下撤消按钮,则文本框(详细视图)和网格视图(概览)中的值不会重置。

网格视图和文本框都连接到绑定源 (m_storesBS)

编辑:

我尝试更改 GetAll 方法的列表类型,但没有成功:

public virtual BindingList<T> GetAll()
{
    return _objectSet.ToBindingList();
}

【问题讨论】:

  • 你的绑定源是什么?
  • 复杂类型的IEnumerable

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


【解决方案1】:

您应该使用BindingList&lt;YourType&gt; 将数据绑定到您的控件。然后无需任何额外工作即可反映更改。

【讨论】:

  • 喜欢m_storesBX.DataSource = new BindingList&lt;YourType&gt;(_storeRepository.GetAll());
  • 我现在正在使用 BindingList 但错误仍然存​​在。 stackoverflow.com/questions/1396256/…
  • 我不知道,您使用的是 EntityFramework。 (你没有在你的问题和标签中提到这一点)。这是 MSDN 如何将 EntityFramework 绑定到 GridView 和其他控件的链接。 link
  • 在我的存储库中使用 ObjectQuery 将公开 EntityFramework 详细信息。此外,我的 UI 与 EF 耦合。你知道手动方法吗?
  • 我知道的唯一选择是在您的 EntityFramework 和 UI 之间构建一个业务层。业务层可以填充 BindingList,并且必须管理 EntityFramework 和该 BindingList 之间的更改更新。 :-(
【解决方案2】:

问题是 EF 正在缓存我的整个列表 (_storeRepository.GetAll();)。

我现在在我的存储库中使用一个名为 Refresh 的方法。

public void Refresh(T entity, bool storeWins = true)
{
    _objectContext.Refresh(
       storeWins ? RefreshMode.StoreWins : RefreshMode.ClientWins, entity);
}

撤消按钮:

private void btn_Undo_Click(object sender, EventArgs e)
{
    var store = GetCurrentStore();
    _storeRepository.Refresh(store);
    StoresBindingNavigator.BindingSource.ResetBindings(false);
}

通过这个我强制 EF 调用数据库。

【讨论】:

    猜你喜欢
    • 2015-03-31
    • 1970-01-01
    • 2017-09-12
    • 2019-10-30
    • 2018-05-03
    • 1970-01-01
    • 2013-04-24
    • 2012-08-02
    • 1970-01-01
    相关资源
    最近更新 更多