Listview не полностью обновляется в databind () после обратной передачи
-
03-07-2019 - |
Вопрос
У меня есть элемент управления ListView, который демонстрирует странное поведение - строки только частично обновляются после обратной передачи. Я надеюсь, что кто-то здесь может пролить свет на то, почему это может происходить.
Мой источник данных просмотра списка связан с списком элементов, который хранится в состоянии сеанса страницы. Это сделано намеренно, частично для тайм-аута устаревших просмотров, поскольку данные просматривают несколько пользователей. В простой курортной операции сортировка выполняется на странице с помощью javascript, а порядок данных списка / сеанса синхронизируется с помощью обратных вызовов. Обратный вызов также проверяет уровни разрешений. При выполнении более сложной операции курорта javascript на странице выполняет обратную передачу на страницу для обработки логики сортировки. Список / Сеанс обновляется как при обратном вызове, затем элемент управления просмотра списка возвращается к данным. Страница снова загружается, и в строках отображается новый порядок. Нет проблем, верно?
Проблема в том, что некоторые элементов в просмотре списка не меняют значения в соответствии с новым порядком. Хотя гиперссылки и текст, который обрабатывается на странице (например, & Lt;% # Eval (& Quot; ProjectAbbrev & Quot;)% & Gt;), обновляются соответствующим образом, флажки, литералы и выпадающие списки, значения которых установлены с помощью метода события OnItemDataBound, не являются - они остаются " заморожены " на месте, хотя пошаговое выполнение кода показывает, что метод выполняется во время обратной передачи, и что элементам управления СЛЕДУЕТ установить их новые значения. Если я пойду и укрою список вручную, скажем, половина исходного размера, конечно же, будут заполнены только те элементы, но флажки и тому подобное сохранят свои исходные значения.
Итак, мой вопрос: почему эти элементы не обновляются вместе с остальными элементами управления listview на обратной передаче? У меня такое ощущение, что я неправильно понимаю жизненный цикл страницы в ASP.NET или столкнулся с некоторой ошибкой.
На данный момент я думаю, что мне придется перенести более сложную операцию сортировки на страницу в javascript, но это будет довольно сложно, и я хотел бы избежать этого, если это возможно. Р> <ч> ОБНОВЛЕНИЕ: я попытался установить EnableViewState в false, и это не исправляет это. Я не мог использовать эту тактику в любом случае, потому что другие части страницы (сохранить) полагаются на чтение состояния просмотра в конце. <Ч> ОБНОВЛЕНИЕ: я предоставляю некоторые фрагменты кода в надежде, что они могут пролить свет на эту проблему:
Страница
: элемент HyperLink будет корректно обновляться после обратной передачи, но CheckBox, значение которого назначено в методе OnQueueRepeater_ItemDataBound, останется прежним. Р>
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="TextProcessorProjects.ascx.cs" Inherits="ETD.UI.Controls.TextProcessorProjects" %>
<asp:ListView ID="QueueListView" runat="server" OnItemDataBound="OnQueueRepeater_ItemDataBound">
<ItemTemplate>
<tr>
<td><asp:HyperLink runat="server" ID="ProjectIDLink"><%# Eval("ProjectAbbrev") %></asp:HyperLink></td>
<td><asp:CheckBox runat="server" ID="ScannedCheckBox" BorderStyle="None" /></td>
</tr>
</ItemTemplate>
</asp:ListView>
Код сзади: при обратной передаче выполняется следующий код:
protected List<Book> QueueDataItems
{
get { return (List<Book>)Session["Queue"]; }
set { Session["Queue"] = value; }
}
else if (IsPostBack && !Page.IsCallback)
{
// resort QueueDataItems List appropriately
ResortQueue(Request.Params)
// rebind
QueueListView.DataSource = QueueDataItems;
QueueListView.DataBind();
}
protected void OnQueueRepeater_ItemDataBound(object sender, ListViewItemEventArgs e)
{
// ...
// ... other controls set
CheckBox scannedCheckBox = e.Item.FindControl("ScannedCheckBox") as CheckBox;
scannedCheckBox.Checked = book.Scanned;
}
ОБНОВЛЕНИЕ: я разочаровался в том, чтобы заставить это работать, и переместил мою логику сортировки на клиентскую сторону с javascript. Если у кого-то есть какие-либо идеи относительно того, почему происходит такое странное поведение, мне все равно было бы очень интересно услышать их!
Решение
Из какого интереса, на какой странице вы привязываете данные? Page_Load? Р>
Попробуйте на OnPreRender - может помочь.
Другие советы
Похоже, что ViewState запускает и заново заполняет данные. В любом случае, если вы в любом случае выполняете привязку данных в каждой обратной передаче, вам, вероятно, следует установить для параметра EnableViewState вашего ListView значение false, чтобы уменьшить размер страницы.
Я думаю, что это связано с порядком, когда различные события запускаются в течение жизненного цикла страницы. См. Обзор жизненного цикла страницы ASP.NET . Вы должны выполнить привязку данных в Page_OnPreRender, чтобы убедиться, что повторное заполнение выполняется после управляющих событий (которые приведут к обновлению данных) на странице.
Возможно, по какой-то причине ваш QueueListView снова связывается.
Попробуйте сбросить значение DataSource после DataBind (), чтобы увидеть, что происходит
QueueListView.DataBind();
QueueListView.DataSource = null;
Есть ли вероятность, что это может быть проблемой кеширования? Я столкнулся с подобной проблемой, используя просмотр списка с источником XMLDatasource. Я пытался отключить все viewstate. Я бы связал просмотр списка в коде и использовал XPath, чтобы выписать все это на экран на моей странице aspx. Это было использовано при поиске .... в следующий раз, когда я выполнял поиск, новая информация не появилась. Причина в том, что в XMLDatasource по умолчанию включено кэширование. В моем случае я каждый раз ударил по БД и не нуждался в кешировании. Я отключил кеширование на источнике данных, и все мои проблемы были исправлены.
Я упоминаю об этом только потому, что ошибка, которая у меня была, звучит идентично вашей. Я не вижу, как вы извлекаете книгу из базы данных элементов - и вы не используете источник данных XML, судя по всему ... но я подумал, что комментарий может вызвать у вас что-то. Удачи .... хотя, похоже, ты уже перешел: -).
Является ли элемент управления флажком ReadOnly = true или Enabled = false?
У меня были проблемы с элементами управления с одним из этих свойств, установленным, как указано выше, без обновления, независимо от того, как я пытаюсь обработать элемент управления в коде. Я бы подумал, что отключение viewstate также обойдёт этот маленький & Quot; feature & Quot; ASP.NET, но стоит попробовать.
Кроме того, если элементы отсортированы с помощью клиентского кода, сохраняется ли этот порядок на обратной передаче? Я не думаю, что вы можете изменить объект CLR, который у вас есть в сеансе, с помощью JavaScript.
Не уверен, поможет ли это, замените <% # Eval (" ProjectAbbrev ")% > с Hyperlink.Text, назначенным в методе OnQueueRepeater_ItemDataBound, и проверьте, правильно ли заполнены все строки.
Это, вероятно, не решит вашу проблему, но будет интересно узнать результат.