2011-07-14 41 views
4

在我的應用程序中,我有一組數據對象,它們定義應用程序在執行時收集的數據類型。使用C撤消綁定對象中的更改#

用戶可以打開一個對話框窗口來編輯這些對象,並且該對話框窗口包含綁定到集合的DataGridView實例。這意味着用戶所做的任何更改都會立即應用,這並不好。

另一個問題是,此對話框窗口有一個取消按鈕,允許用戶放棄自打開窗口後所做的所有更改。

當前窗口打開時,我序列化所有的對象(淺拷貝將不起作用),如果用戶點擊取消,然後我反序列化它們以恢復它們。我遇到的問題是這很混亂。它會更改所有引用,並且這些對象中的一些還會存儲數據歷史記錄,而這些歷史記錄不是序列化的。然後我必須讓應用程序通過事件來通知對象以更新他們的引用等,這是一種痛苦。

有沒有更好的方法來解決這個問題?

+0

DataTable提供編輯緩衝。如果您可以計算出如何用對象集合填充DataTable,那麼只需將網格綁定到DataTable,並且如果用戶取消,則不要在表上調用AcceptChanges()。 –

回答

3

一種更好的方式,使用即熟到框架的接口 - IEditable

BeginEdit
的CancelEdit
EndEdit中

的基本想法是,你當您調用BeginEdit時,創建一些對象狀態的快照。在CancelEdit上,您將回滾到該SavedState,並在EndEdit上提交它。

魔鬼是在細節當然。下面是曾擔任過執行答案相似,所以問題的一些想法

http://www.paulstovell.com/blog/runtime-ui-binding-behavior-ieditableobject-adapter

乾杯流行的鏈接,
Berryl

注意:這不是概念上的不同是什麼託科是說,你應該給他答案。但值得在單獨的答案中加以說明,因爲它以.Net慣用方式形式化了概念,並提供了對有用實現的更多見解。另外,說「慣用」這個詞很好玩: - )

+0

我不認爲Tocco的答案考慮了整個應用程序對集合中的對象的引用。這看起來更適合我的需求 - 我會更接近一點。謝謝! – Andy

+0

Upvote因爲「慣用」很有趣! :) ...哦,因爲這是一個很好的答案。 – mikemanne

0

您可以使用原始版本和對象的副本或整個集合的副本。
因此,您可以編輯副本並保存以執行更改或取消以保留原始對象/集合。

this

+0

如果我製作副本並且用戶編輯了副本,然後點擊OK,那麼我是不是有和現在一樣的問題?即所有的對象引用現在都需要在整個應用程序中更新?這是我想避免的問題。或者你的意思是,當用戶點擊確定時,我應該複製這些改變,包括刪除移除的對象和添加新的對象? – Andy

+0

@Andy,如果你爲集合'a'製作一個副本'b',你可以允許用戶編輯副本'b',如果他點擊OK,你應該設置'a = b'。如果他點擊取消,你應該丟棄'b'。這是主意。 – Tocco

+0

集合中所有對象的引用如何?這些會改變他們嗎?請注意,用戶可以自己編輯對象,而不僅僅是從集合中添加/刪除。 – Andy