Tengo un control ListView que muestra un comportamiento extraño: las filas solo se actualizan parcialmente después de una devolución de datos. Espero que alguien aquí pueda arrojar algo de luz sobre por qué esto podría estar ocurriendo.Listview no se actualiza completamente en databind() después de la devolución de datos
My listview DataSource está vinculado a una Lista de elementos que se almacena en el estado de sesión de la página. Se trata de vistas obsoletas intencionadas, parcialmente de tiempo de espera, ya que varios usuarios ven los datos. En una operación de complejo simple, la clasificación se maneja en la página a través de javascript, y el orden de datos de la lista/sesión se mantiene sincronizado mediante devoluciones de llamada. La devolución de llamada también verifica los niveles de permisos. En una operación de complejo en particular que es más complicada, el javascript en la página hace una devolución de datos a la página para manejar la lógica de clasificación. La lista/sesión se actualiza como en la devolución de llamada, luego el control de vista de lista se recupera a los datos. La página se carga de nuevo y las filas muestran el nuevo orden. No hay problema, ¿verdad?
El problema es que algunos de los elementos en la vista de lista no cambian de valor de acuerdo con el nuevo orden. Mientras que los hipervínculos y el texto procesados en la página (es decir, <% # Eval ("ProjectAbbrev")%>) se actualizan adecuadamente, las casillas de verificación, literales y desplegables que tienen sus valores establecidos mediante el método de evento OnItemDataBound no se mantienen "congelado" en su lugar, a pesar de que recorrer el código revela que el método se ejecuta durante la devolución de datos, y que los controles DEBERÍAN establecerse en sus nuevos valores. Si voy y trunco manualmente la lista para decir, la mitad del tamaño original, con suficiente seguridad solo esos ítems se repoblarán, pero las casillas de verificación y demás aún conservan sus valores originales.
Así que mi pregunta es: ¿Por qué estos elementos no se actualizan junto con el resto de los elementos de control listview en la devolución de datos? Tengo la sensación de que estoy malinterpretando el ciclo de vida de la página en ASP.NET o que he encontrado un error de algún tipo.
En este momento estoy pensando que tendré que mover la operación de clasificación más complicada a la página en javascript, pero eso será bastante complicado y me gustaría evitar hacerlo si es posible.
ACTUALIZACIÓN: He intentado configurar EnableViewState en falso y no soluciona esto. No pude usar esa táctica en ningún caso porque otras partes de la página (guardar) se basan en leer viewstate al final.
ACTUALIZACIÓN: Estoy proporcionando algunos fragmentos de código con la esperanza de que pudieran arrojar alguna luz sobre esta cuestión:
Página: El elemento de hipervínculo se actualizará correctamente después de la devolución de datos, pero la casilla de verificación que tiene su valor asignado en el El método OnQueueRepeater_ItemDataBound, permanecerá igual.
<%@ 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>
Código atrás: En la devolución de datos, ejecuta el siguiente código:
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;
}
ACTUALIZACIÓN: He renunciado en conseguir que esto funcione y moví mi lógica de clasificación para el lado del cliente con javascript. Sin embargo, si alguien tiene alguna idea de por qué estaba ocurriendo este extraño comportamiento, ¡aún estaría muy interesado en escucharlos!
¡Gracias, tim! Ya pasé de esto, pero si vuelvo a encontrarme con este problema, me aseguraré de dar una oportunidad. – patjbs
Tim tiene razón; tuve exactamente el mismo problema y Page_PreRender funciona en las devoluciones de datos :) – Jason