У меня есть простая форма интрасети (ASP.NET 2.0) с GridView, привязанным к данным из Active Directory.Это делается с помощью SqlDataSource, который выбирает из представления, извлекающего данные из AD.Это работает лучше, чем выполнение запросов LDAP напрямую из ASP.NET, поскольку я могу выполнять объединения таблиц и т. Д. Без особых хлопот.GridView имеет столбец CommandField с кнопкой редактирования и несколько шаблонов EditItem с шаблонами DropDownLists для выбора допустимых значений.
Обновления, с другой стороны, выполняются путем непосредственного подключения к AD.Чтобы учесть это, я должен обработать событие OnRowUpdating GridView и установить для параметра Cancel в GridViewUpdateEventArgs значение true, поскольку для SqlDataSource не определена команда обновления.Затем он просто создает DirectorySearcher, выполняет поиск пользователя на основании Однозначного имени (ключ данных GridView), вызывает GetDirectoryEntry () для результата, устанавливает свойства пары и, наконец, вызывает CommitChanges () для DirectoryEntry.Никаких проблем - обновление данных просто отлично.
Это , то есть , но ведет себя немного запутанно.Кажется, есть некоторая задержка распространения при обновлении данных.После обновления требуется примерно десять секунд, прежде чем представление, используемое для SqlDataSource, отразит изменение.Я не уверен, является ли это типичным поведением AD, или если представление подключается к другому DC, отличному от того, для которого выпускается обновление.Такое поведение само по себе не является проблемой, и я могу с этим смириться, если это необходимо.
Но, хотя это не большая проблема, оно вызывает еще одну проблему - GridViewсортируется по умолчанию в столбце «компания», который является одним из свойств, которые пользователь может редактировать.Если пользователь меняет компанию в строке, немного подождет (или продолжит делать несколько правок), а затем перейдет к редактированию другой строки, он может в конечном итоге отредактировать строку рядом с той, которую он хотел.Это происходит потому, что GridView выполняет повторную привязку, и внезапно строка, в которой изменилась его компания, сортируется в другом месте списка.GridView, очевидно, запускает редактирование на основе индекса строки, и вдруг в этом индексе появляется другая строка, потому что представление, используемое для источника данных, внезапно просто догоняет реальность.
Что за недоумениечто GridView пытается привязать данные к каждому постбеку.Раньше мне приходилось вызывать DataBind () после внесения изменений в данные, чтобы обеспечить актуальность данных, но теперь они каждый раз радуются попаданию в источник данных.И все же страница ViewState занимает около 66 КБ, поэтому я знаю, что GridView помещает туда свои данные.
Так что, в общем, это будет пара исправлений (которых у меня нет)пока успешно реализовано).
Остановите привязку данных GridView к каждой загрузке страницы и придерживайтесь того, что кешируется во ViewState.В аргументах события OnDataBinding GridView отсутствует свойство «Отмена», а настройка «Отмена» во время события OnSelecting источника данных просто оставляет меня с пустым GridView.
Исправлена задержка распространения.Опять же, у меня нет настроения на это, но если это способ исправить неожиданно прыгающие ряды, то это нормально для меня.Должен ли я просто убедиться, что я явно подключаюсь к одному DC как в представлении базы данных, так и при обновлении AD из ASP.NET?Или что-то еще происходит?
Запуск редактирования строки на основе первичного ключа строки, а не индекса.Я предполагаю, что мне нужно создать CommandButton в строке, установить CommandArgument на первичный ключ строки, затем пройтись по всем строкам в GridView на обратной передаче и вручную установить EditIndex соответственно.
Я открыт для других идей.Если ViewState окажется парой сотен КБ, это выполнимо.Доступ к этому сайту осуществляется через довольно быструю локальную сеть, и он предназначен исключительно для внутреннего использования.