使用带有绑定源的winforms,如何知道用户是否修改了记录?

时间:2014-07-06 03:20:43

标签: c# winforms entity-framework bindingsource bindingnavigator

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

我希望使用从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。但是当当前项目本身发生变化时也会引发它 有没有办法解决它被提出的原因?

2 个答案:

答案 0 :(得分:0)

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

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

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)。然后,您将以未修改的状态重新附加原始人员,然后以迭代的方式应用修改后的人员的属性更改:

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

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

答案 1 :(得分:0)

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