在WinForm项目开发中习惯于对于集合数据的批量修改,再一次性提交更新同步到数据库。这里我们就必须实现对对象的改变的跟踪记录,我们实现对象的改变跟踪有许多方式,大致我尝试了两种方式:1:对象强制实现接口,State守信和MakeMark行为。2:利用字典序继续改变。虽然1的方式是否更加合理,但是在winform中与BindingSource集合使用简化修增修改的书写,配合的不是很好,供给开发人员使用不是很爽。于是我修改成为第二种方式集合记录更改,在继续在原集合真实修改,触发BindingSource事件和与BindingSource很好的结合。

   我们所要做的是对集合实体的变化做记录,这个在微软类库中的System.Data.DataTable一样,利用一套变化记录机制,我们可以抽象出我们接口:

public interface IObjectObserveable

{

bool IsCanReject

{

get;

}

void AcceptChanged();

void RejectChanged();

event ObjectCollectionChanged objectCollectionChanged;

IEnumerable<KeyValuePair<object, ObjectObserveChangeState>> GetChangeds();

IEnumerable<object> GetChangeds(ObjectObserveChangeState changedState);

}

public enum ObjectObserveChangeState

{

None, Add, Modify, Delete

}
接口中: 

1:包含守信IsCanReject表示是否可以回滚(必须是可序列化的集合者可以回滚,内部利用序列化实现单级撤销)。

2:AcceptChanged表示接受更改。

3:RejectChanged拒绝更改回滚。

4:GetChangeds获取数据集合的更改或者某类型更改的集合。

数据更改通知事件:

public class ObjectCollectionChangedEventArgs : EventArgs
    { 

        public ObjectObserveChangeState ChangeState
        {
            get;
            private set;
        } 

        public object ItemValue
        {
            get;
            private set;
        } 

        public ObjectCollectionChangedEventArgs(ObjectObserveChangeState changeState, object itemValue)
        {
            this.ChangeState = changeState;
            this.ItemValue = itemValue;
        }
    } 

    public delegate void ObjectCollectionChanged(object sender, ObjectCollectionChangedEventArgs e);

相关文章: