2009-05-04 10 views
5

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!

Respuesta

6

de interés, lo punto de la página de enlace de datos que está en? Page_Load?

Pruébelo OnPreRender - podría ayudar.

+0

¡Gracias, tim! Ya pasé de esto, pero si vuelvo a encontrarme con este problema, me aseguraré de dar una oportunidad. – patjbs

+0

Tim tiene razón; tuve exactamente el mismo problema y Page_PreRender funciona en las devoluciones de datos :) – Jason

1

Parece que el ViewState está iniciando y repoblando los datos. En cualquier caso, si de todos modos está vinculado a Databack en cada postback, probablemente debería establecer EnableViewState de ListView en false para reducir el tamaño de la página.

+0

desactivando el ViewState no resuelve el problema, desafortunadamente. – patjbs

0

Quizás su QueueListView se vuelva a encuadernar por alguna razón.

intentar restablecer el valor de origen de datos después de la DataBind() para ver qué pasa

QueueListView.DataBind(); 
QueueListView.DataSource = null; 
+0

gracias por la idea, pero desafortunadamente no hay suerte allí – patjbs

0

Hay alguna posibilidad de que esto podría ser un problema de almacenamiento en caché? Me encontré con un problema similar al utilizar una vista de lista con un XMLDatasource. Intenté apagar todos los viewstate. Me gustaría vincular la vista de lista en el código de atrás y usar XPath para escribirlo todo en la pantalla de mi página aspx. Esto fue utilizado en una búsqueda ... la próxima vez que hice una búsqueda, no apareció ninguna de la nueva información. La razón es porque XMLDatasource tiene el almacenamiento en caché habilitado de forma predeterminada. En mi caso, estaba llegando al DB cada vez y no tenía necesidad de guardarlo en la memoria caché. Desactivé el almacenamiento en caché de la fuente de datos y todos mis problemas se solucionaron.

Sólo menciono esto porque el error que estaba teniendo suena idéntica a la suya. No puedo ver cómo está recuperando el libro en el elemento enviado a la fecha, y no está usando un origen de datos XML por el aspecto de las cosas ... pero pensé que el comentario podría desencadenar algo para usted. Buena suerte ... aunque parece que ya te has mudado :-).

0

¿El checkbox controla ReadOnly = true o Enabled = false?

he tenido problemas con los controles con una de estas propiedades establecidas anteriormente como no actualizar sin importar lo que trato de maltratar el control en el código subyacente. Creo que deshabilitar viewstate también pasaría por alto esa pequeña "característica" de ASP.NET, pero vale la pena intentarlo.

Además, si los elementos se ordenan a través de código del lado del cliente, es que conserva para pedidos en la devolución de datos? No creo que pueda alterar el objeto CLR que tiene en sesión a través de javascript.

+0

No está configurado para solo lectura, y el problema se produce tanto para los usuarios cuyas casillas de verificación están habilitadas, como para aquellos para quienes no están habilitados. Interesante idea que podría ver. En cuanto a la clasificación del lado del cliente, la ejecución de un recurso dispara una función de devolución de llamada que mantiene los datos de la sesión del servidor actualizados con lo que el cliente está viendo. – patjbs

0

No estoy seguro si esto ayuda, reemplace <% # Eval ("ProjectAbbrev")%> con el texto Hyperlink.Text asignado en el método OnQueueRepeater_ItemDataBound y vea si todas las filas se llenan correctamente.

Esto probablemente no va a resolver su problema, pero será interesante conocer el resultado.

+0

Ese campo en realidad se estaba procesando correctamente en el código que se muestra arriba. Fueron las casillas de verificación y los menús desplegables (que no se muestran) que no se pudieron utilizar/redibujar correctamente junto con el resto de la pantalla. – patjbs

+0

Sí, entendí lo que querías decir. Por cierto, no vio ningún menú desplegable en su código, ¿cómo se realizó el enlace de datos? Intenta renderizar solo texto/etiqueta para las casillas de verificación y las listas desplegables sin los controles. Ver si los valores se representan. –

2

creo que esto está relacionado con el orden de los diferentes eventos que se desencadenan durante el ciclo de vida de la página. Ver ASP.NET Page Life Cycle Overview. Debería hacer un enlace de datos en Page_OnPreRender para asegurarse de que la replopulación se realice después de los eventos de control (que causará la actualización de los datos) en la página.

+0

Esto.FFS, seguramente cuando vuelva a llamar a DataBind, ¿debería invalidar el ControlState? –

Cuestiones relacionadas