Frage

Ich habe ein Listview-Steuerelement, das ein sonderbares Verhalten ausstellt - Zeilen werden nur zum Teil nach einer Postbacks zu aktualisieren. Ich bin der Hoffnung, jemand hier kann etwas Licht auf, warum dies sein könnte auftritt.

Meine Listview Datasource ist eine Liste der Elemente gebunden, die in der Seite Sitzungszustand gespeichert wird. Dies ist beabsichtigt, teilweise out-of-date Blick auf Timeout, da mehrere Benutzer die Daten anzeigen. Auf einem einfachen Ausweg Betrieb wird die Sortierung auf Seite via Javascript behandelt, und die Liste / Sitzungsdaten Bestellung wird synchron über Rückrufe gehalten. Rückruf prüft auch, ob Berechtigungsstufen. An einem besonderen Ort Operation, die komplizierter, das Javascript auf der Seite macht eine Postbacks auf die Seite der Sortierlogik zu handhaben. Die Liste / Session wird wie in der Callback aktualisiert, dann ist das Listview-Steuerelement auf die Daten zurückprallen. Die Seite lädt wieder, und die Zeilen zeigen die neue Ordnung. Kein Problem, nicht wahr?

Das Problem ist, dass einig der Elemente in der Listenansicht nicht ändern Wert in Übereinstimmung mit der neuen Ordnung. Während die Hyperlinks und Text, der in geeigneter Weise auf der Seite (dh wie <% # Eval ( „ProjectAbbrev“)%>) sind, Kontrollkästchen, Literale aktualisiert verarbeitet wird, und Dropdown-Listen, die ihre Werte über die OnItemDataBound Ereignismethode haben, sind nicht - sie bleiben „eingefroren“ an Ort und Stelle, auch wenn durch den Code schrittweise zeigt, dass das Verfahren während des Postbacks ausgeführt wird, und dass die Kontrollen sollten ihre neue Werte eingestellt werden. Wenn ich gehen und manuell die Liste gestutzt zu sagen, die Hälfte der ursprünglichen Größe, sicher genug, um nur die Elemente neu besiedelt werden, aber die Kontrollkästchen und so noch ihre ursprünglichen Werte beibehalten.

Also meine Frage ist: Warum sind diese Elemente nicht mit dem Rest der Listview-Steuerelement auf dem Postbacks Aktualisierung zusammen? Ich habe das Gefühl, dass ich entweder die Seite Lebenszyklus in ASP.NET Mißverständnis oder dass ich einen Fehler irgendeiner Art begegnet sind.

An dieser Stelle Ich denke ich muss die komplizierteren Sortiervorgang auf die Seite in Javascript bewegen, aber das wird ziemlich heikel und ich möchte dabei möglichst vermeiden.


UPDATE: Ich habe versucht, EnableViewState auf false gesetzt und es dies nicht zu beheben. Ich konnte es nicht, dass die Taktik in jedem Fall verwenden, da andere Teile der Seite (speichern) stützen sich auf den Ansichtszustand 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 HyperLink Element wird richtig nach dem Postback aktualisieren, aber die CheckBox, die in dem OnQueueRepeater_ItemDataBound Verfahren zugeordnet seinen Wert hat, werden das gleiche bleiben.

<%@ 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 aufgegeben dies auf immer meine Sortierlogik auf die Client-Seite mit Javascript zu arbeiten und bewegte. Wenn jemand eine Idee hat, warum dieses seltsame Verhalten allerdings passiert, würde ich immer noch sehr daran interessiert, sie zu hören!

War es hilfreich?

Lösung

aus Interesse, welcher Punkt auf der Seite sind Databinding Sie? Page_Load?

Versuchen Sie es auf OnPreRender -. Aushelfen könnte

Andere Tipps

Klingt wie die Viewstate in kickt und die Daten neu zu besiedeln. In jedem Fall, wenn Sie in jeder Postbacks sind Databinding sowieso, sollten Sie setzen wahrscheinlich die EnableViewState Ihrer Listview auf false Seitengröße zu reduzieren.

Ich denke, das die Ordnung verbunden ist, wenn die verschiedenen Ereignisse während des Seitenlebenszyklus ausgelöst werden. Siehe ASP.NET Seite Lebenszyklus Überblick . Sie sollten in Datenbindung Page_OnPreRender tun der replopulating um sicherzustellen, dass nach dem Steuerereignis erfolgt (das wird die Datenaktualisierung verursacht) auf der Seite.

Vielleicht ist Ihr QueueListView wird immer aus irgendeinem Grund neu gebunden.

Versuchen Sie den Datasource-Wert nach dem DataBind Zurücksetzen (), um zu sehen, was passiert,

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

Jede Chance, dies ein Caching-Problem sein könnte? Ich lief in ein ähnliches Problem eine Listenansicht mit einem XmlDataSource verwenden. Ich habe versucht, alle Ansichtszustand ausschalten. Ich würde die Listenansicht im Code binden hinter und XPath verwenden sie alle aus dem Bildschirm auf meine Aspx-Seite zu schreiben. Dies wurde in einer Suche verwendet .... das nächste Mal, wenn ich eine Suche hat keine der neuen Informationen auftauchten. Der Grund dafür ist, weil ein XmlDataSource standardmäßig aktiviert ist Caching. In meinem Fall war ich die DB jedes Mal schlagen und hatte keine Notwendigkeit, es cachen. Ich drehte das Caching auf die Datenquelle aus, und alle meine Probleme wurden behoben.

ich dies nur erwähnen, weil die Fehler, die ich mit war identisch mit Ihnen klingt. Ich kann nicht sehen, wie Sie Buch in dem ItemDataBound sind abrufen - und du bist nicht eine XML-Datenquelle durch die Blicke der Dinge mit ..... aber ich dachte, der Kommentar könnte etwas für Sie auslösen. Viel Glück .... obwohl es klingt wie Sie bereits weitergezogen: -).

Ist das Kontrollkästchen Kontrolle Readonly = true oder Enabled = false?

Ich habe mit einem dieser Eigenschaften, wie oben nicht aktualisiert, egal gesetzt Ärger mit den Kontrollen hat, wie ich versuche, die Kontrolle in der Code-behind hieven. Ich würde denken, den Ansichtszustand deaktivieren würde auch umgehen, dass wenig „Feature“ von ASP.NET, aber es ist ein Versuch wert.

Auch wenn die Einzelteile über client Code sortiert werden, ist, dass auf dem Postback erhalten bestellen? Ich glaube nicht, dass Sie das CLR-Objekt ändern, können Sie in der Sitzung über Javascript haben.

Nicht sicher, ob das hilft, ersetzen <% # Eval ( „ProjectAbbrev“)%> mit dem Hyperlink.Text im OnQueueRepeater_ItemDataBound Verfahren zugewiesen und sehen, ob alle Zeilen korrekt aufgefüllt bekommen.

Dies wird wahrscheinlich Ihr Problem nicht lösen, sondern wird interessant sein, um das Ergebnis zu kennen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top