2009-05-04 8 views
5

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!

risposta

6

per interesse, a che punto della pagina ci si lega? Page_Load?

Provalo su OnPreRender - potrebbe aiutare.

+0

Grazie tim! Sono praticamente passato da questo, ma se mi sono imbattuto in questo problema di nuovo, sarò sicuro di fare un tentativo. – patjbs

+0

Tim ha ragione - Ho avuto lo stesso identico problema e Page_PreRender funziona sui postback :) – Jason

1

Suoni come il ViewState sta dando il calcio e ripopolamento dei dati. In ogni caso, se si è comunque in grado di associare i dati in ogni postback, è consigliabile impostare EnableViewState di ListView su false per ridurre le dimensioni della pagina.

+0

disabilitare il viewstate non risolve il problema, sfortunatamente. – patjbs

0

Forse il tuo QueueListView viene rilanciato per qualche motivo.

provare a reimpostare il valore DataSource dopo il DataBind() per vedere cosa succede

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

grazie per il pensiero ma sfortunatamente non ci sono fortuna – patjbs

0

C'è qualche possibilità che questo potrebbe essere un problema di cache? Mi sono imbattuto in un problema simile utilizzando un listview con XMLDatasource. Ho provato a spegnere tutti i viewstate. Legherei la listview nel codice sottostante e utilizzo XPath per scrivere tutto sullo schermo sulla mia pagina aspx. Questo è stato usato in una ricerca .... la prossima volta che ho fatto una ricerca, nessuna delle nuove informazioni è arrivata. Il motivo è dovuto al fatto che un XMLDatasource ha abilitato la memorizzazione nella cache per impostazione predefinita. Nel mio caso stavo colpendo il DB ogni volta e non avevo bisogno di memorizzarlo nella cache. Ho disattivato la memorizzazione nella cache sull'origine dati e tutti i miei problemi sono stati risolti.

Ho solo menzionato questo perché l'errore che stavo facendo sembra identico al tuo. Non riesco a vedere come stai recuperando il libro nel itemdatabound - e non stai usando una fonte di dati XML dall'aspetto delle cose ..... ma ho pensato che il commento potesse scatenare qualcosa per te. Buona fortuna ... anche se sembra che tu sia già passato :-).

0

La casella di controllo controlla ReadOnly = true o Enabled = false?

Ho avuto problemi con i controlli con una di queste proprietà impostate come sopra non aggiornate, indipendentemente da come tento di maneggiare il controllo nel codice sottostante. Penserei che disabilitare il viewstate aggirerebbe anche quella piccola "funzionalità" di ASP.NET, ma vale la pena provare.

Inoltre, se gli articoli sono ordinati tramite codice clientide, tale ordine è conservato nel postback? Non penso che tu possa modificare l'oggetto CLR che hai in sessione tramite javascript.

+0

Non impostato per sola lettura, e il problema si verifica sia per gli utenti per i quali le caselle di controllo sono abilitate, sia per coloro per i quali non lo sono. Un'idea interessante però che potrei guardare. Per quanto riguarda l'ordinamento lato client, l'esecuzione di un resort attiva una funzione di callback che mantiene aggiornati i dati della sessione del server con ciò che il client vede. – patjbs

0

Non sicuro se questo aiuta, sostituire <% # Eval ("ProjectAbbrev")%> con Hyperlink.Text assegnato nel metodo OnQueueRepeater_ItemDataBound e vedere se tutte le righe vengono popolate correttamente.

Questo probabilmente non risolverà il problema, ma sarà interessante conoscere il risultato.

+0

Questo campo veniva effettivamente visualizzato correttamente nel codice mostrato sopra. Sono state le caselle di controllo e i menu a discesa (non mostrati) che non sono riusciti a ricorrere/ridisegnare correttamente insieme al resto del display. – patjbs

+0

Sì, ho capito cosa intendevi. Btw, non ho visto nessun dropdown nel tuo codice, come è stato fatto il databinding? Prova a visualizzare solo testo/etichetta per le caselle di controllo e i menu a discesa senza i controlli. Verifica se i valori sono visualizzati. –

2

Penso che questo sia correlato all'ordine in cui i diversi eventi vengono attivati ​​durante il ciclo di vita della pagina. Vedi ASP.NET Page Life Cycle Overview. Dovresti eseguire l'associazione dati in Page_OnPreRender per assicurarti che la ripopolazione venga effettuata dopo gli eventi di controllo (che causeranno l'aggiornamento dei dati) nella pagina.

+0

Questo.FFS, sicuramente quando si chiama di nuovo DataBind, dovrebbe invalidare il ControlState? –

Problemi correlati