Отмена изменений в связанных объектах с C # - PullRequest
4 голосов
/ 14 июля 2011

В моем приложении есть коллекция объектов данных, которые определяют, какие типы данных приложение собирает при выполнении.

Пользователь может открыть диалоговое окно для редактирования этих объектов, и это диалоговое окно содержит экземпляры DataGridView, связанные с коллекциями. Это означает, что любые изменения, внесенные пользователем, применяются немедленно, что нехорошо.

Другая проблема заключается в том, что в этом диалоговом окне есть кнопка «Отмена», позволяющая пользователю отменить все изменения, внесенные с момента открытия окна.

В настоящее время, когда окно открыто, я сериализую все объекты (мелкая копия не будет работать), и если пользователь нажимает кнопку Отмена, то я десериализую их, чтобы восстановить их. Проблема, с которой я сталкиваюсь, состоит в том, что это грязно. Он изменяет все ссылки, и некоторые из этих объектов также хранят историю данных, которая не сериализуется. Затем мне нужно, чтобы через приложение появлялись события, уведомляющие объекты об обновлении их ссылок и т. Д. Это боль.

Есть ли лучший подход к этой проблеме?

Ответы [ 2 ]

3 голосов
/ 15 июля 2011

Там - это лучший способ, используя интерфейс, встроенный в фреймворк - IEditable

BeginEdit
CancelEdit
EndEdit

Основная идея заключается в том, что вы создаете снимок состояния некоторого объекта при вызове BeginEdit.На CancelEdit вы откатываетесь к этому SavedState, а на EndEdit вы его фиксируете.

Дьявол, конечно, в деталях.Вот популярная ссылка, которая послужила ответом реализации на подобные вопросы SO для некоторых идей

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

Cheers,
Berryl

ПРИМЕЧАНИЕ: это не 'концептуально отличается от того, что говорит токко, и вы должны дать ему ответ.НО стоит изложить в отдельном ответе, потому что он формализует концепцию .Net идиоматическим способом и предлагает более глубокое понимание полезной реализации.К тому же, это весело - сказать идиоматическое слово: -)

0 голосов
/ 14 июля 2011

Вы можете работать с оригинальной версией и копией вашего объекта или копией всей вашей коллекции.
Таким образом, вы можете отредактировать копию и сохранить ее, чтобы внести изменения, или отменить ее, чтобы сохранить исходный объект / коллекцию.

Как это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...