在WinForm项目开发中习惯于对于集合数据的批量修改,再一次性提交更新同步到数据库。这里我们就必须实现对对象的改变的跟踪记录,我们实现对象的改变跟踪有许多方式,大致我尝试了两种方式:1:对象强制实现接口,State守信和MakeMark行为。2:利用字典序继续改变。虽然1的方式是否更加合理,但是在winform中与BindingSource集合使用简化修增修改的书写,配合的不是很好,供给开发人员使用不是很爽。于是我修改成为第二种方式集合记录更改,在继续在原集合真实修改,触发BindingSource事件和与BindingSource很好的结合。
我们所要做的是对集合实体的变化做记录,这个在微软类库中的System.Data.DataTable一样,利用一套变化记录机制,我们可以抽象出我们接口:
{
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获取数据集合的更改或者某类型更改的集合。
数据更改通知事件:
最后对于List集合的实现如下:
在最后WinForm中测试:
对于新增和删除我们只需利用BindingSource的,bs.AddNew() 和bs.RemoveCurrent();感觉使用起来方便了吧。最后获取数据更改利用GetChangeds。对于保存后AcceptChanges。
效果图:
欢迎大家指正和建议,希望能够共同进步,谢谢。
本文转自破狼博客园博客,原文链接:http://www.cnblogs.com/whitewolf/archive/2012/03/27/2419289.html,如需转载请自行联系原作者