Pregunta

Tengo un control ListView que está exhibiendo un comportamiento extraño - filas son sólo parcialmente la actualización después de una devolución de datos.Estoy esperando que alguien de aquí puede arrojar algo de luz sobre por qué esto podría ser que ocurran.

Mi listview origen de datos está vinculada a una Lista de elementos que se almacenan en la página de estado de sesión.Esto es intencional y, parcialmente, a un tiempo de espera fuera de la fecha vistas desde varios usuarios ver los datos.En un plano complejo de la operación, la clasificación que se maneja en la página mediante javascript, y la lista/datos de la sesión por el mantenimiento del orden en la sincronización a través de las devoluciones de llamada.Devolución de llamada también controla los niveles de permisos.En un determinado funcionamiento complejo que es más complicado, el código javascript en la página que hace una devolución 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, a continuación, el control listview es el rebote de los datos.La carga de la página, de nuevo, y las filas muestran el nuevo orden.No hay problema, ¿verdad?

El problema es que algunos de los elementos del listview no el valor de cambio de acuerdo con el nuevo orden.Mientras que los enlaces y el texto que se procesa en la página (es decir, como <%# Eval("ProjectAbbrev") %>) se actualizan correctamente, casillas de verificación, literales y listas desplegables que tienen sus valores a través de la OnItemDataBound método de evento no que se quedan "congelados" en el lugar, incluso a pesar de recorrer el código revela que el método se ejecuta durante la devolución, y que los controles se DEBEN establecer a sus nuevos valores.Si me voy y truncar manualmente la lista de decir, la mitad del tamaño original, por supuesto sólo los elementos que se vuelve a llenar, pero las casillas de verificación y tal aún conservan sus valores originales.

Así que mi pregunta es:¿Por qué no son estos elementos de actualización, junto con el resto de la listview elementos de control sobre la devolución?Tengo la sensación de que estoy bien de malentendido el ciclo de vida de página en ASP.NET o que me he encontrado con un error de algún tipo.

En este momento estoy pensando en que voy a tener que mover el más complicado de la operación de ordenación a la página en javascript, pero que va a ser bastante complicado y me gustaría evitar hacerlo si es posible.


ACTUALIZACIÓN:He probado la configuración de EnableViewState en falso y no se soluciona esto.No puedo utilizar esa táctica en cualquier caso, porque las otras partes de la página (guardar) se basan en la lectura del viewstate en la final.
ACTUALIZACIÓN:Me estoy dando algunos fragmentos de código en la esperanza de que podría arrojar algo de luz sobre este tema:

Página:El Hipervínculo elemento se actualice correctamente después de la devolución, pero la Casilla de verificación que tiene su valor asignado en el OnQueueRepeater_ItemDataBound método, seguirá siendo la misma.

<%@ 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 detrá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:Me he dado por vencida en conseguir que esto funcione y se mudó a mi lógica de clasificación para el lado del cliente con javascript.Si alguien tiene alguna idea de por qué este comportamiento extraño estaba sucediendo, sin embargo, yo todavía estaría muy interesado en escuchar de ellos!

¿Fue útil?

Solución

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

Probarlo en OnPreRender - podría ayudar.

Otros consejos

Suena como el ViewState es patear en y la repoblación de los datos.En cualquier caso, si eres de Enlace de datos en cada devolución de todos modos, usted probablemente debería establecer el EnableViewState de su ListView a false para reducir el tamaño de la página.

Creo que esto está relacionado con el orden de cuando los diferentes eventos que se desencadenan durante el ciclo de vida de página.Ver ASP.NET la Página de Visión general del Ciclo de Vida.Usted debe hacer el enlace de datos en Page_OnPreRender para asegurarse de que el replopulating se hace después de los eventos de control (que hará de actualización de datos) en la página.

Tal vez su QueueListView es re-obligado por alguna razón.

Trate de restablecer el origen de datos de valor después de que el DataBind() a ver qué pasa

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

Cualquier posibilidad de que esto podría ser un problema de caché?Me encontré con un problema similar, el uso de un listview con un XMLDatasource.He probado a desactivar todos los viewstate.Me gustaría enlazar el listview en el código detrás y el uso de XPath para escribir todo a la pantalla de mi página aspx.Esto fue utilizado en una búsqueda....la próxima vez que hice una búsqueda, ninguno de la nueva información que se presentó.La razón es porque un XMLDatasource ha habilitado el almacenamiento en caché de forma predeterminada.En mi caso yo estaba golpeando la DB cada vez y no tenía la necesidad de la memoria caché.He desactivado el almacenamiento en caché en el origen de datos y todos mis problemas se solucionaron.

Sólo digo esto porque el error que yo estaba teniendo suena idéntica a la suya.Yo no puedo ver cómo se está recuperando libro en el itemdatabound - y usted 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....a pesar de que suena como usted ya ha movido en :-).

Es el control de casilla de verificación ReadOnly=true o Enabled=false?

He tenido problemas con los controles con una de estas propiedades de ajuste como la anterior actualización no importa cómo lo intente manhandle el control en el código detrás.Yo creo que deshabilitar el viewstate también evitar que a poco "característica" de ASP.NET pero vale la pena un tiro.

También, si los elementos están ordenados a través de clientside código, es que el pedido se conservan en la devolución?No creo que se pueda modificar el objeto CLR tiene en la sesión a través de javascript.

No estoy seguro si esto ayuda, reemplazar <%# Eval("ProjectAbbrev") %> con el Hipervínculo.Texto asignado en el OnQueueRepeater_ItemDataBound método y ver si todas las filas obtener rellena correctamente.

Probablemente esto no resuelve tu problema, pero será interesante saber el resultado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top