GridView строки прыгают вокруг при редактировании данных - PullRequest
1 голос
/ 14 июня 2011

У меня есть простая форма интрасети (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 помещает туда свои данные.

Так что, в общем, это будет пара исправлений (которых у меня нет)пока успешно реализовано).

  1. Остановите привязку данных GridView к каждой загрузке страницы и придерживайтесь того, что кешируется во ViewState.В аргументах события OnDataBinding GridView отсутствует свойство «Отмена», а настройка «Отмена» во время события OnSelecting источника данных просто оставляет меня с пустым GridView.

  2. Исправлена ​​задержка распространения.Опять же, у меня нет настроения на это, но если это способ исправить неожиданно прыгающие ряды, то это нормально для меня.Должен ли я просто убедиться, что я явно подключаюсь к одному DC как в представлении базы данных, так и при обновлении AD из ASP.NET?Или что-то еще происходит?

  3. Запуск редактирования строки на основе первичного ключа строки, а не индекса.Я предполагаю, что мне нужно создать CommandButton в строке, установить CommandArgument на первичный ключ строки, затем пройтись по всем строкам в GridView на обратной передаче и вручную установить EditIndex соответственно.

Я открыт для других идей.Если ViewState окажется парой сотен КБ, это выполнимо.Доступ к этому сайту осуществляется через довольно быструю локальную сеть, и он предназначен исключительно для внутреннего использования.

1 Ответ

0 голосов
/ 15 июня 2011

Обновление Active Directory из ASP.NET имеет тенденцию быть немного медленным независимо от того, как вы к нему обращаетесь.

Не зная, как выглядит ваш код, я бы предложил инструменты UpdatePanel и UpdateProgess, если вы используетенабор инструментов ASP.NET по умолчанию.

Это предотвратит любые дополнительные вызовы на сервер до завершения обновления.Примерно так:

    <asp:UpdateProgress ID="updateMyGridViewProgress" runat="server">
        <ProgressTemplate>
            <img src="images/loading.gif" alt="Updating the information" />
        </ProgressTemplate>
    </asp:UpdateProgress>

    <asp:UpdatePanel ID="updateMyGridView" runat="server">
        <ContentTemplate>
            <asp:GridView 
                ID="myGridView" 
                OnRowUpdating="UpdateAdInfo"
                runat="server" >
            </asp:GridView>
        </ContentTemplate>
    </asp:UpdatePanel>

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

Однако ASP.NET AJAX UpdatePanel по умолчаниюимеет тенденцию быть многословным в информации, которую она отправляет обратно на сервер даже для простых операций.

Лично я бы старался избегать использования GridView и использовать что-то более дружественное к AJAX (например, jqGrid http://www.trirand.com/blog/)

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