Зависит от того, что вы действительно хотите. У вас есть требования? Вы ловите предложения?
Одно из возможных решений
Если у вас есть явное действие сохранения, которое вызывается после завершения редактирования,
- Пользователь переходит на страницу,
- Пользователь изменяет таблицу,
- Пользователь "сохраняет",
- Страница извлекает текущие значения из хранилища данных (на момент сохранения)
- Страница сравнивает текущие значения с измененными значениями
- Любые конфликты подсвечиваются и просит пользователя «разрешить» конфликт
- Переходите к шагу 3. до тех пор, пока не будут обнаружены конфликты
Другое возможное решение
Если вы хотите избежать цикла с шага 3. до шага 7., вы всегда можете заключить шаги 4.–6 в транзакцию, что означает любую попытку сохранить блоков до тех пор, пока текущее сохранение не будет разрешено. , Это довольно трудоемко, требует немного больше работы и может эффективно снизить общий параллелизм.
Еще одно возможное решение
Другое возможное решение - сделать процесс менее дискретным и более непрерывным. Обеспечить прямой поток данных.
- Создание службы WindowsService / WCF, которая отправляет или разрешает опрос данных таблицы,
- Страница опрашивает данные или асинхронно получает данные от удаленного сервиса,
- Страница изменяет содержимое страницы пользователя с полученными данными
- Новые значения, которые не конфликтуют, временно выделяются одним цветом (указывая на бесконфликтное изменение), скажем, светло-зеленый
- Новые конфликтующие значения постоянно выделяются красным
Если у вас есть процесс сохранения, никакие красные значения не могут быть сохранены до разрешения.
Последнее (предлагаемое) возможное решение
Если у вас нет явного действия сохранения,
- Пользователь нажимает на ячейку (фактически запрашивая редактирование ячейки)
- Страница связывается со службой Windows \ WCF, запрашивая «блокировку» в этой ячейке,
- Если ни один другой пользователь не запросил «блокировку» для этой конкретной ячейки, заблокируйте ячейку для этого пользователя и верните true. Если другой пользователь запросил блокировку в этой конкретной ячейке, соблюдайте текущую блокировку и верните false.
Если удаленная служба возвращает false, тогда прецедент заканчивается, и ячейка не может быть изменена . Если удаленная служба возвращает значение true, пользователь изменяет содержимое, а когда он покидает ячейку или перезагружает страницу или что-то еще, удаленная служба снимает блокировку.
Заключение
Хорошо, немного машет рукой, но более чем достаточно жира, чтобы жевать. Подумайте, есть много возможных решений.