Ho un controllo ListView che presenta un comportamento strano: le righe vengono aggiornate solo parzialmente dopo un postback. Spero che qualcuno qui possa far luce sul motivo per cui questo potrebbe accadere.Visualizzazione elenco non completamente aggiornabile su databind() dopo il postback
My listview DataSource è associato a un Elenco di elementi che è memorizzato nello stato della sessione di pagina. Questo è intenzionale, in parte per interrompere le visualizzazioni non aggiornate poiché più utenti visualizzano i dati. In una semplice operazione, l'ordinamento viene gestito sulla pagina tramite javascript e l'ordine dei dati della lista/sessione viene mantenuto sincronizzato tramite callback. La callback controlla anche i livelli di permessi. In una particolare operazione di resort che è più complicata, il javascript nella pagina fa un postback alla pagina per gestire la logica di ordinamento. La lista/sessione viene aggiornata come nel callback, quindi il controllo listview è rimbalzato ai dati. La pagina si carica nuovamente e le righe mostrano il nuovo ordine. Nessun problema, giusto?
Il problema è che alcuni degli elementi nella listview non cambiare il valore secondo il nuovo ordine. Mentre i collegamenti ipertestuali e il testo elaborato sulla pagina (ovvero come <% # Eval ("ProjectAbbrev")%>) vengono aggiornati in modo appropriato, le caselle di controllo, i letterali e i menu a discesa che hanno i loro valori impostati tramite il metodo di evento OnItemDataBound non lo sono - rimangono "congelato" sul posto, anche se l'introduzione del codice rivela che il metodo viene eseguito durante il postback e che i controlli DOVREBBERO essere impostati sui loro nuovi valori. Se vado a troncare manualmente l'elenco per dire, metà della dimensione originale, è sufficiente che solo questi elementi vengano ripopolati, ma le caselle di controllo e così conservano ancora i loro valori originali.
Quindi la mia domanda è: perché questi elementi non vengono aggiornati insieme al resto degli elementi di controllo listview sul postback? Ho la sensazione di non aver frainteso il ciclo di vita della pagina in ASP.NET o di aver incontrato un bug di qualche tipo.
A questo punto penso che dovrò spostare la più complicata operazione di ordinamento alla pagina in javascript, ma sarà piuttosto complicato e vorrei evitare di farlo se possibile.
UPDATE: Ho provato a impostare EnableViewState su false e non risolve questo problema. In ogni caso, non potrei usare questa tattica perché altre parti della pagina (salva) si basano sulla lettura del viewstate alla fine.
UPDATE: Sto fornendo alcuni frammenti di codice, nella speranza che essi possano far luce su questo tema:
Pagina: L'elemento di collegamento ipertestuale aggiornare correttamente dopo il postback, ma il CheckBox che ha il suo valore assegnato nel Il metodo OnQueueRepeater_ItemDataBound rimarrà lo stesso.
<%@ 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>
codice dietro: il postback, il seguente codice viene eseguito:
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;
}
UPDATE: Ho rinunciato a ottenere questo al lavoro e si è trasferito la mia logica di ordinamento per il lato client con javascript. Se qualcuno avesse qualche idea sul perché questo strano comportamento stesse accadendo, sarei comunque molto interessato a sentirli!
Grazie tim! Sono praticamente passato da questo, ma se mi sono imbattuto in questo problema di nuovo, sarò sicuro di fare un tentativo. – patjbs
Tim ha ragione - Ho avuto lo stesso identico problema e Page_PreRender funziona sui postback :) – Jason