在我的应用程序中,我有一组数据对象,用于定义应用程序在执行时收集的数据类型。
用户可以打开一个对话框窗口来编辑这些对象,该对话框窗口包含绑定到集合的DataGridView实例。这意味着用户所做的任何更改都会立即应用,这是不好的。
另一个问题是此对话窗口有一个取消按钮,允许用户放弃自打开窗口以来所做的所有更改。
目前,当窗口打开时,我会序列化所有对象(浅拷贝不起作用),如果用户点击取消,那么我反序列化它们以恢复它们。我遇到的问题是这很麻烦。它会更改所有引用,其中一些对象也会存储数据历史记录,而不是序列化的。然后,我必须让事件在应用程序中波及,以通知对象更新其引用等。这很痛苦。
有没有更好的方法解决这个问题?
答案 0 :(得分:3)
是更好的方法,使用在框架中熟化的界面 - IEditable
BeginEdit
的CancelEdit
EndEdit
基本思想是在调用BeginEdit时创建某个对象状态的快照。在CancelEdit上,您回滚到SavedState,在EndEdit上提交它。
当然,魔鬼在于细节。这是一个受欢迎的链接,作为某些想法的类似SO问题的实现答案
http://www.paulstovell.com/blog/runtime-ui-binding-behavior-ieditableobject-adapter
干杯,
Berryl
注意:这在概念上与tocco所说的不同,你应该给他答案。但值得在单独的答案中拼写出来,因为它以.Net惯用的方式形式化了这个概念,并提供了对有用实现的更多洞察。此外,说“惯用”一词很有趣: - )
答案 1 :(得分:0)
您可以使用原始版本和对象副本或整个集合的副本 因此,您可以编辑副本并保存以执行更改,或者取消以保留原始对象/集合。
赞this