Listview не полностью обновляется в databind () после обратной передачи

StackOverflow https://stackoverflow.com/questions/821053

Вопрос

У меня есть элемент управления 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, и проверьте, правильно ли заполнены все строки.

Это, вероятно, не решит вашу проблему, но будет интересно узнать результат.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top