【问题标题】:Using winforms with a binding source, How do I know if the user has modified a record?使用带有绑定源的winforms,我如何知道用户是否修改了记录?
【发布时间】:2014-07-06 03:20:42
【问题描述】:

我在 winforms 表单上有一个带有 bindingsource 的绑定导航器。 我的数据源来自实体框架列表。

我想使用从Julie Lerman Course at Pluralsight 学到的技术来跟踪绑定源中每个实体的状态

添加和编辑很简单,我只是填写了添加和删除按钮事件

    private void bindingNavigatorAddNewItem_Click(object sender, EventArgs e)
    {
        ((IEntity)(this.personBindingSource.Current)).State = EntityState.Added;
    }

    private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
    {
        ((IEntity)(this.personBindingSource.Current)).State = EntityState.Deleted;
    }

但是没有 EditItemClick 事件,我如何跟踪实体是否已被修改?

请注意,我正在绑定到域类 Person 的断开连接列表

 List<Person> people = MyRepository.GetPeople();
 this.personBindingSource.DataSource =people;
 this.personBindingNavigator.BindingSource = this.personBindingSource;

我有一个接口 IENTity

public interface IEntity
{

    EntityState State { get; set; }
}



public enum EntityState
{
    Unchanged,
    Added,
    Modified,
    Deleted
}

并且 Person 继承自 [更新] 查看 bindingSource 事件属性,我看到 CurrentItemChanged 在修改属性时引发。但是,当当前项目本身发生变化时也会引发它。
有没有办法弄清楚它是出于什么原因提出的?

【问题讨论】:

  • 如何将数据值绑定到绑定导航器中的控件?如果您将实体属性绑定到控件,那么只需通过 UI 更改值应该会自动设置 EntityState.Modified。如果您正确绑定,实体跟踪器应该会为您处理。
  • 谢谢@DavidTansey 我更新了问题以显示实体已断开连接。

标签: c# winforms entity-framework bindingsource bindingnavigator


【解决方案1】:

由于您的实体已断开连接,因此无法通过上下文进行更改跟踪,因此您需要自己跟踪更改。

如果您更改存储库方法以创建您要检索的人员的克隆,我们可以在保存时重新连接原始实体。

List<Person> originalPeople;
List<Person> modifiablePeople = MyRepository.GetPeople(out originalPeople);

您可以阅读该部分 Creating a cloned object containing current, original, or database values 了解如何创建原始人物对象的克隆。

MyRepository.SavePeople 将采用两个参数,originalPeople(克隆)和 modifiablePeople(绑定到包含更改的 UI 的修改后的人)。然后,您将在未修改的状态下重新附加您的 originalPeople,然后以迭代方式应用修改后的人员的属性更改:

var entry = context.Entry(original Person); 
entry.CurrentValues.SetValues(modifiedPerson);

阅读以下部分: Setting current or original values from another object

【讨论】:

  • 感谢@user978139,我认为必须有一种方法可以在修改发生时标记修改......也许与INotifyChangeProperty有关
  • INotifyPropertyChanged 在绑定情况下很有用,可以通知 UI 控件值的更新。您可以保留已为存储库有权访问的每个实体修改的属性的字符串/布尔键值对字典。在存储库中,您将迭代字典并将属性设置为修改后的 context.Entry(blog).Property("Name").IsModified = true;
  • 这不能回答我的问题。我怎么知道绑定的对象已经被修改了?
【解决方案2】:
private void bindingSource_ListChanged(object sender, ListChangedEventArgs e)
    {
        if (e.ListChangedType == ListChangedType.ItemChanged)
        {
            var entity = (IEntity)((BindingSource)sender).Current;
            if (entity.State == EntityState.Unchanged)
            {
                entity.State = EntityState.Modified;
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多