2

Я работаю в Visual Studio 2010 с помощью C#/ASP.NET и базы данных SQL-сервера. Я пытаюсь установить веб-сайт, который позволит менеджерам назначать сотрудников для выполнения различных задач. Проблема в том, что если два менеджера работают одновременно, неправильный сотрудник может быть назначен задаче. Список сотрудников представлен в виде сетки.Выбор неправильного элемента из-за старых данных в GridView

Проблема возникает из-за того, что один из пользователей просматривает старые данные в виде сетки.

Допустим, что первый человек загружает список и GridView выглядит следующим образом:

-Employee 1

-Employee 2

-Employee 3

-Employee 4

Затем приходит второе лицо и назначает Employee 2, который удаляет Employee 2 из списка. Фактический список теперь выглядит следующим образом:

-Employee 1

-Employee 3

-Employee 4

Но первый человек по-прежнему считает, что это потому, что их страница не обновлена:

-Employee 1

-Employee 2

-Employee 3

-Employee 4

Первый человек затем пытается назначить сотрудника 3 к задаче. Они все еще видят старый список. Когда они нажимают для выполнения задания, страница возвращается к серверу (видимо, выбор строки в элементе управления gridview является событием на стороне сервера, поэтому я не уверен, есть ли способ обходить этот http://forums.asp.net/t/1706468.aspx/1). Страница перезагружает и пытается выполнить событие postback, проверяет и видит, что элемент управления еще не действителен (поскольку привязка данных происходит после того, как событие postback должно быть обработано), поэтому я думаю, что событие postback задерживается до момента привязки данных. (Вот порядок событий на странице загрузки http://msdn.microsoft.com/en-us/library/ms178472(v=vs.100).aspx) После того, как GridView было DataBound, данные до настоящего времени, как это:

-Employee 1

-Employee 3

-Employee 4

И тогда событие postback можно обработать. Событие postback содержит индекс строки элемента управления, который был выбран. Третья строка была выбрана, поэтому событие postback получает из сетки сотрудника 4 (Кто сейчас находится в третьей строке). Затем он использует эту информацию для получения уникального идентификатора сотрудника 4, когда нам нужен уникальный идентификатор сотрудника 3. Как мы гарантируем, что мы получим правильный идентификатор сотрудника в этой ситуации?

Проблема заключается в том, что щелчок применяется после привязки данных и изменения сетки. Я думал, что предотвращать выполнение обратной передачи страницы было бы неплохо попробовать, но операции gridview - все серверные, поэтому я не думаю, что смогу это сделать.Я не знаю способа сохранить связанные данные через postback, поэтому каждый раз, когда мы отправляем назад, мы обязаны получать новые, потенциально разные данные. Мне кажется, что я прошел через большинство вариантов, вы видите что-то не так с моими рассуждениями или какие-то предложения о новых вещах? Есть ли способ получить идентификатор сотрудника до того, как страница вернется?

Эта страница отлично работает только для одного пользователя, проблема возникает только в том случае, если несколько пользователей вносят изменения в одно и то же время.

ответ

0

Мне пришлось обрабатывать привязку данных самостоятельно, вместо того, чтобы использовать объект ObjectDataSource, чтобы сделать это автоматически.

Раньше я использовал DataSourceID GridView, чтобы связать его с источником данных, который будет запрашивать сервер для данных на каждом обновлении страницы. Объект ObjectDataSource заставил данные привязываться автоматически. Чтобы получить дополнительный контроль, который мне нужен, мне пришлось обрабатывать всю привязку данных в коде за моей страницей.

Я сделал это, сохранив данные сетки в представлении и загрузив данные из окна просмотра на каждой странице обновления. Таким образом, я мог бы контролировать, когда данные gridview были обновлены с данными в базе данных.

Эти две страницы были весьма полезны в результате чего меня к ответу:

DataBind and Postback

http://www.aarongoldenthal.com/post/2009/04/19/Manually-Databinding-a-GridView.aspx

2

Для управления вы можете включить ViewState, так что данные GridView не должны перезагружаться во время PostBack.

Вместо этого элемент управления запоминает первые загруженные данные во время PostBack и продолжает работать с этим.

Конечно, это не решает проблему с параллелизмом, например, если кто-то что-то делает с сотрудником, который уже удален. В этом случае вам нужно будет проверить фактическую базу данных еще раз перед выполнением действия и показать пользователю сообщение об ошибке/предупреждении, если он работает с старыми данными.

+0

Это именно то решение, я ищу; мы предполагаем, что пользователи будут работать с отдельными данными на данный момент. Я просто попытался включить ViewState, но все равно данные загружены. Есть ли хороший способ убедиться, что он не перезагрузится, если вы явно не расскажете об этом? Спасибо! – Sauce

+0

Как вы загружаете данные в первую очередь? Убедитесь, что вы только вызываете привязку данных, когда 'Page.IsPostback' является ложным. Тогда не должно быть перезагрузки данных. – magnattic

+0

Я установил DataSourceID GridView в объект ObjectDataSource, который отправляет запрос на сервер для данных. Я думаю, что это должно автоматически вызывать databind, потому что я не звоню в databind в любом месте своего кода. – Sauce