|
Сохранение записей из DataGrid в БД, MVVM
|
|||
---|---|---|---|
#18+
Всем доброго времени суток! помогите советом, как лучше реализовать: DataGrid привязан к ObservableCollection<Person>. Пользователь изменяет значения в нескольких строках. По кнопке Сохранить, изменения сохраняются в БД. При возникновении ошибки при сохранении в БД соответствующая строка в DataGrid восстанавливает предыдущее значение и пользователю показывается текст ошибки. Смотрел в сторону IEditableObject - но что-то не пойму как его применить именно к этой задаче (для построчной отсылки изменений в БД он идеально подходит), тем более, что сразу после окончания редактирования строки (до сохранения в БД) автоматом вызывается метод EndEdit(). ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2012, 18:36 |
|
Сохранение записей из DataGrid в БД, MVVM
|
|||
---|---|---|---|
#18+
Зачем востанавливать по ошибки? И в каком случае ошибка происходит? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2012, 18:42 |
|
Сохранение записей из DataGrid в БД, MVVM
|
|||
---|---|---|---|
#18+
Абсолют, Восстанавливать, чтобы пользователь видел значение до сохранения в БД. Какая ошибка - не суть, просто БД при попытке сохранения вернула исключение. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2012, 18:47 |
|
Сохранение записей из DataGrid в БД, MVVM
|
|||
---|---|---|---|
#18+
Не особо понял логику. Смотрите, пользователь париться заполняет новые значения в гриде (а это труд, как ни как) и пытается схоронить в бэдэ, а тут бац! и ошибка. И все его новые значения обратно в старые? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2012, 18:51 |
|
Сохранение записей из DataGrid в БД, MVVM
|
|||
---|---|---|---|
#18+
Абсолют, не все. А только те, при сохранении которых возникла ошибка. Метод Save() должен вызываться для каждой строки, где изменились значения. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2012, 18:54 |
|
Сохранение записей из DataGrid в БД, MVVM
|
|||
---|---|---|---|
#18+
Nicky_NАбсолют, не все. А только те, при сохранении которых возникла ошибка. Метод Save() должен вызываться для каждой строки, где изменились значения. Даже если так. Не проще ли валидацию сделать? ;) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2012, 18:55 |
|
Сохранение записей из DataGrid в БД, MVVM
|
|||
---|---|---|---|
#18+
Абсолют, валидация - само собой должна быть на клиенте! тут дополнительный уровень - ответ бд при попытке изменить строку. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.12.2012, 18:59 |
|
Сохранение записей из DataGrid в БД, MVVM
|
|||
---|---|---|---|
#18+
Nicky_N, IEditableObject вам здесь слабо поможет. Вариант: На момент сохранения иметь список изменений источника данных. После сохранения нужно знать какие изменения не прошли. Т.е. ваш серверсайд должен вас об этом уведомить в ответе. Зная, какие именно изменения не прошли, восстанавливать предыдущие значения. Но, во-первых, почему не устраивает вариант с валидацией? У нас есть БД, которая, исходя из неизвестной нам логики, может отвергать те или иные изменения? Вы посылаете 1 запрос на 1 строку при сохранении и часть может не "дойти"? Затем, Что делать с непрошедшими изменениями? "Забывать" их? Как сигнализировать клиенту о том, что изменения второй строки из трех посланных на сохранение не прошли и как указать какое именно поле не "понравилось" БД? MessageBox? ToastNotifications? Подсвечивать красным прямо в гриде? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2012, 07:23 |
|
Сохранение записей из DataGrid в БД, MVVM
|
|||
---|---|---|---|
#18+
enigmaticНа момент сохранения иметь список изменений источника данных. После сохранения нужно знать какие изменения не прошли. Т.е. ваш серверсайд должен вас об этом уведомить в ответе. Зная, какие именно изменения не прошли, восстанавливать предыдущие значения. Скорее всего, пойду именно по этому пути. Т.е. во ViewModel добавлю объект-копию модели, которую буду заполнять по PropertyChanged + флаг IsInEditMode. При сохранении вызывается метод Save() репозитария, если успешный ответ - сбрасываем флаг, если нет - сбрасываем флаг, восстанавливаем данные из копии и выводим пользователю сообщение об ошибке. enigmaticНо, во-первых, почему не устраивает вариант с валидацией? У нас есть БД, которая, исходя из неизвестной нам логики, может отвергать те или иные изменения? Вы посылаете 1 запрос на 1 строку при сохранении и часть может не "дойти"? Банальная ситуация: данные, которые видит у себя на экране пользователь уже устарели (другой пользователь уже их изменил) => необходимо уведомить пользователя о том, что он "затрет" изменившиеся данные и для получения актуальных данных необходимо нажать кнопку обновить. enigmaticЗатем, Что делать с непрошедшими изменениями? "Забывать" их? Как сигнализировать клиенту о том, что изменения второй строки из трех посланных на сохранение не прошли и как указать какое именно поле не "понравилось" БД? MessageBox? ToastNotifications? Подсвечивать красным прямо в гриде? Безусловно, о непрошедших изменениях "забывать" нельзя. вариант: красная рамка в гриде + в доп. колонке в конце грида выводить сообщение об ошибке в строке с ошибочными данными. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2012, 10:32 |
|
Сохранение записей из DataGrid в БД, MVVM
|
|||
---|---|---|---|
#18+
По-моему, у вас всё хорошо. Но немного занудства:авторСкорее всего, пойду именно по этому пути. Т.е. во ViewModel добавлю объект-копию модели, которую буду заполнять по PropertyChanged + флаг IsInEditMode. При сохранении вызывается метод Save() репозитария, если успешный ответ - сбрасываем флаг, если нет - сбрасываем флаг, восстанавливаем данные из копии и выводим пользователю сообщение об ошибке.В случае отрицательного ответа ещё нужно знать какие изменения прошли, а какие нет, дабы знать что восстанавливать. Nicky_NБанальная ситуация: данные, которые видит у себя на экране пользователь уже устарели (другой пользователь уже их изменил) => необходимо уведомить пользователя о том, что он "затрет" изменившиеся данные и для получения актуальных данных необходимо нажать кнопку обновить.По сути, оптимистическая блокировка? Это классно. А моему серверсайду пофигу на эти ньюансы, т.к. нет большого потока пользователей. Кстати, а вы уже придумали как вы собираетесь "мержить" конфликтные изменения? :D авторБезусловно, о непрошедших изменениях "забывать" нельзя. вариант: красная рамка в гриде + в доп. колонке в конце грида выводить сообщение об ошибке в строке с ошибочными данными.Можно вместо доп.колонки приспособить механизм выдачи ошибок валидации, к слову. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2012, 13:35 |
|
Сохранение записей из DataGrid в БД, MVVM
|
|||
---|---|---|---|
#18+
enigmaticПо сути, оптимистическая блокировка? Это классно. А моему серверсайду пофигу на эти ньюансы, т.к. нет большого потока пользователей. Кстати, а вы уже придумали как вы собираетесь "мержить" конфликтные изменения? :D Да, совершенно верно, она самая. Стараюсь ее использовать для всех изменяющихся данных. При конфликтах решение принимает сам пользователь: хочешь увидеть актуальное состояние данных - жми кнопку обновить, все и так устраивает - жми выход :) enigmaticМожно вместо доп.колонки приспособить механизм выдачи ошибок валидации, к слову. Можно поподробнее идею раскрыть? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.12.2012, 14:06 |
|
Сохранение записей из DataGrid в БД, MVVM
|
|||
---|---|---|---|
#18+
Nicky_Nenigmatic"мержить" конфликтные изменения?..Да, совершенно верно, она самая. Стараюсь ее использовать для всех изменяющихся данных. При конфликтах решение принимает сам пользователь: хочешь увидеть актуальное состояние данных - жми кнопку обновить, все и так устраивает - жми выход :)> хочешь увидеть актуальное состояние данных - жми кнопку обновить > все и так устраивает - жми выход :) Но ведь если он нажмет "обновить" или выйдет, то он потеряет свои текущие изменения. Как быть, если он хочет видеть в чем конфликт данных и принимать решение - сохранить свои изменения поверх актуальных или отбросить свои изменения? Nicky_NenigmaticМожно вместо доп.колонки приспособить механизм выдачи ошибок валидации, к слову.Можно поподробнее идею раскрыть?Приспособить вижуалы валидации DataGrid для выдачи сообщений об таких ошибках сохранения данных. Всё равно эти вижуалы уже описаны в шаблоне, грех не воспользоваться. Т.е. мы не смогли сохранить строку такую-то, подсвечиваем её, ругаемся на неактуальность данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2012, 07:18 |
|
Сохранение записей из DataGrid в БД, MVVM
|
|||
---|---|---|---|
#18+
enigmatic, enigmaticКак быть, если он хочет видеть в чем конфликт данных и принимать решение - сохранить свои изменения поверх актуальных или отбросить свои изменения? вопрос, конечно, интересный. я так глубоко не копаю. можно из функции Update в БД возвращать актуальные данные при ошибке, показывать пользователю и ждать от него решения, но, имхо, как-то уж очень геморно) enigmaticПриспособить вижуалы валидации DataGrid для выдачи сообщений об таких ошибках сохранения данных. Всё равно эти вижуалы уже описаны в шаблоне, грех не воспользоваться. Т.е. мы не смогли сохранить строку такую-то, подсвечиваем её, ругаемся на неактуальность данных. Классная картинка - как раз то, что надо. Шаблон, в котором вижуалы описаны - опенсорс, угостите ссылочкой? ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2012, 10:51 |
|
Сохранение записей из DataGrid в БД, MVVM
|
|||
---|---|---|---|
#18+
Nicky_NКлассная картинка - как раз то, что надо. Шаблон, в котором вижуалы описаны - опенсорс, угостите ссылочкой? Опенсорсней не бывает, это же всё есть в дефолтном шаблоне :) Напр. ValidationSummary описывается в шаблоне DataGrid 'а, подсветка красным для строки это Rectange x:Name="InvalidVisualElement", и т.д. Просмотрите дефолтный шаблон досконально и знайте, что если вы его не переопределяли, то он у вас подключен изначально. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.12.2012, 14:11 |
|
|
start [/forum/topic.php?fid=21&fpage=34&tid=1441564]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
104ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
others: | 11ms |
total: | 220ms |
0 / 0 |