Listview pas entièrement mise à jour sur databind() après la publication

J'ai un contrôle ListView qui présente un comportement étrange - les lignes ne sont que partiellement mise à jour après la publication. J'espère que quelqu'un ici peut jeter quelque lumière sur les raisons de ce qui pourrait être de se produire.

Mon listview source de données est lié à une Liste d'articles qui est stockée dans la page d'état de session. Cela est intentionnel, partiellement en attente out-of-date, les vues depuis plusieurs utilisateurs de visualiser les données. Sur une simple station opération, le tri est traitée à la page grâce à javascript, et de la liste/les données de session au maintien de l'ordre dans la synchronisation via des rappels. Rappel vérifie également pour les niveaux d'autorisation. Sur une station en particulier, qui est plus compliqué, le javascript sur la page fait une publication sur la page pour gérer la logique de tri. De la Liste/Session de mise à jour dans le rappel, puis le contrôle listview est rebond pour les données. Le chargement de la page à nouveau, et les lignes de voir le nouvel ordre. Pas de problème, non?

Le problème est que certains des éléments dans la liste ne change pas de valeur, conformément à la nouvelle ordonnance. Alors que les liens hypertexte et le texte qui est traitée à la page (c'est à dire comme <%# Eval("ProjectAbbrev") %>) sont correctement mis à jour, des cases à cocher, des littéraux, et des listes déroulantes qui ont leurs valeurs définies par la OnItemDataBound méthode d'événements ne sont - ils rester "bloqués" dans, même si la progression dans le code révèle que la méthode est exécutée lors de la publication, et que les contrôles DEVRAIENT être mis à leur de nouvelles valeurs. Si je vais tronquer manuellement la liste à dire, la moitié de la taille d'origine, bien sûr, seuls les éléments sont à nouveau remplies, mais les cases à cocher et un tel conservent leurs valeurs d'origine.

Donc ma question est: Pourquoi ne sont pas ces éléments de mise à jour avec le reste de la liste de contrôle des éléments sur la publication? J'ai le sentiment que je suis en train de malentendu, le cycle de vie de page dans ASP.NET ou que j'ai rencontré un bug de quelque sorte.

À ce point, je pense que je vais avoir à se déplacer le plus compliqué l'opération de tri à la page en javascript, mais qui sera assez délicate et je voudrais éviter de le faire si possible.


Mise à JOUR: j'ai essayé de réglage EnableViewState pour faux et il ne permet pas de résoudre ce problème. Je ne pouvais pas utiliser cette tactique en tout cas, car d'autres parties de la page (enregistrer) s'appuient sur la lecture de l'état d'affichage à la fin.


Mise à JOUR: je suis en fournissant quelques extraits de code dans l'espoir qu'ils pourraient jeter quelque lumière sur cette question:

Page: Le lien Hypertexte élément ne permet de mettre à jour correctement après la publication, mais la Case à cocher qui a sa valeur affectée dans le OnQueueRepeater_ItemDataBound méthode reste la même.

<%@ 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 derrière: Sur la publication, il exécute le code suivant:

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;
}

Mise à JOUR: j'ai renoncé à l'obtention de ce travail et a déménagé ma logique de tri pour le côté client avec javascript. Si quelqu'un a des idées sur le pourquoi de ce comportement étrange se passait bien, je serais toujours très intéressés à entendre!

OriginalL'auteur patjbs | 2009-05-04