Ich habe ein ListView-Steuerelement, das ein seltsames Verhalten zeigt - Zeilen werden nur teilweise nach einem Postback aktualisiert. Ich hoffe, dass hier jemand etwas Licht auf die Gründe dafür werfen kann.Listview nicht vollständig auf Datenind() nach Postback aktualisieren
Meine ListView DataSource ist an eine Liste von Elementen gebunden, die im Seitensitzungsstatus gespeichert ist. Dies ist beabsichtigt, um veraltete Ansichten teilweise zu veralten, da mehrere Benutzer die Daten anzeigen. Bei einer einfachen Resort-Operation wird die Sortierung auf der Seite über Javascript abgewickelt, und die Reihenfolge der Liste/Session-Daten wird über Callbacks synchronisiert. Callback überprüft auch die Berechtigungsstufen. Bei einer bestimmten Resort-Operation, die komplizierter ist, macht das Javascript auf der Seite ein Postback auf die Seite, um die Sortierlogik zu handhaben. Die Liste/Sitzung wird wie beim Rückruf aktualisiert. Anschließend wird das Steuerelement listview auf die Daten zurückgesetzt. Die Seite wird erneut geladen und die Zeilen zeigen die neue Reihenfolge an. Kein Problem, oder?
Das Problem ist, dass einig der Elemente in der Listenansicht nicht ändern Wert in Übereinstimmung mit der neuen Ordnung. Während die Hyperlinks und Texte, die auf der Seite verarbeitet werden (zB <% # Eval ("ProjectAbbrev")%>) korrekt aktualisiert werden, bleiben Checkboxen, Literale und Dropdowns, deren Werte über die OnItemDataBound-Ereignismethode gesetzt wurden, nicht erhalten "eingefroren" an Ort und Stelle, obwohl das Durchlaufen des Codes zeigt, dass die Methode während des Postbacks ausgeführt wird, und dass die Steuerelemente auf ihre neuen Werte gesetzt werden sollten. Wenn ich die Liste manuell lehne und sage, halb so groß wie die Originalgröße, dann werden nur diese Punkte neu gefüllt, aber die Checkboxen und solche behalten immer noch ihre ursprünglichen Werte.
Also meine Frage ist: Warum werden diese Elemente nicht zusammen mit dem Rest der listview Steuerelemente auf dem Postback aktualisiert? Ich habe das Gefühl, dass ich den Seitenlebenszyklus in ASP.NET entweder falsch verstanden habe oder dass ich auf einen Fehler gestoßen bin.
An diesem Punkt denke ich, dass ich die kompliziertere Sortieroperation auf die Seite in Javascript verschieben muss, aber das wird ziemlich schwierig sein, und ich möchte es vermeiden, wenn möglich zu tun.
UPDATE: Ich habe versucht, EnableViewState zu false und es nicht beheben. Ich konnte diese Taktik in keinem Fall verwenden, da andere Teile der Seite (speichern) darauf angewiesen sind, den Viewstatus am Ende zu lesen.
UPDATE: Ich habe einige Code-Schnipsel in der Hoffnung, vorausgesetzt, dass sie in dieser Frage etwas Licht könnte:
Seite: Das Element HyperLink richtig nach dem Postback aktualisiert wird, aber die CheckBox, die ihren Wert in der zugeordnet ist OnQueueRepeater_ItemDataBound-Methode bleibt gleich.
<%@ 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>
-Code hinter: Beim Postback der folgende Code ausgeführt:
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: Ich habe auf dem Erhalten dieser aufgegeben zu arbeiten und zog meine Sortierlogik auf die Client-Seite mit Javascript. Wenn jemand irgendwelche Ideen hat, warum dieses seltsame Verhalten passiert ist, würde ich immer noch sehr daran interessiert sein, sie zu hören!
Danke Tim! Ich bin davon ziemlich weit entfernt, aber wenn ich wieder auf dieses Problem stoße, werde ich das sicher tun. – patjbs
Tim hat Recht - ich hatte genau das gleiche Problem und Page_PreRender funktioniert bei Postbacks :) – Jason