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
Vous devez vous connecter pour publier un commentaire.
de l'intérêt, de ce point sur la page êtes-vous de la liaison de données? Page_Load?
Essayer sur OnPreRender - pourrait aider.
Tim est de droite, j'ai eu exactement le même problème et Page_PreRender travaux sur les publications 🙂
A fonctionné pour moi! Un Grand Merci.
OriginalL'auteur tim
Sonne comme le ViewState est des coups de pied dans et remplir à nouveau les données.
En tout cas, si vous êtes de la liaison de données dans chaque publication de toute façon, vous devriez probablement EnableViewState de votre ListView à false pour réduire la taille de la page.
OriginalL'auteur CB01
Je pense que c'est lié à l'ordre de lorsque les différents événements sont déclenchés pendant le cycle de vie de page. Voir ASP.NET Page vue d'ensemble du Cycle de Vie. Vous devriez faire la liaison de données dans Page_OnPreRender assurez-vous que le replopulating est fait après les événements de contrôle (qui entraînera la mise à jour des données) sur la page.
OriginalL'auteur awe
Peut-être que votre QueueListView se faire ré-lié pour une raison quelconque.
Essayez de réinitialiser la base de données de la valeur après la DataBind() pour voir ce qui se passe
OriginalL'auteur Christian Hagelid
Toute chance que cela pourrait être un problème de mise en cache? J'ai rencontré un problème similaire, à l'aide d'une listview avec un XMLDatasource. J'ai essayé de désactiver tous les viewstate. Je voudrais lier la listview dans le code-behind et l'utilisation de XPath pour écrire tout cela à l'écran sur ma page aspx. Cela a été utilisé dans une recherche....la prochaine fois que je fait une recherche, aucune des nouvelles de l'information a montré jusqu'à. La raison en est, car un XMLDatasource mise en cache est activée par défaut. Dans mon cas, j'ai été frappé de la DB à chaque fois et n'avait pas besoin de le mettre en cache. J'ai désactivé la mise en cache sur la source de données et tous mes problèmes ont été résolus.
Je mentionne cela parce que l'erreur j'ai eu des sons identiques à la vôtre. Je ne vois pas comment vous récupérez le livre dans la itemdatabound - et vous n'êtes pas à l'aide d'une source de données XML par les regards des choses.....mais je pensais que le commentaire peut déclencher quelque chose pour vous. Bonne chance....même si il semble que vous avez déjà déplacé sur :-).
OriginalL'auteur
Est le contrôle de case à cocher ReadOnly=true ou Activé=false?
J'ai eu du mal avec les contrôles avec l'une de ces propriétés définies comme ci-dessus de ne pas mettre à jour n'importe comment j'essaie de malmener le contrôle dans le code derrière. Je pense que la désactivation de l'état d'affichage serait également ignorer que peu de "fonctionnalité" de ASP.NET mais ça vaut le coup.
Aussi, si les éléments sont triés par code côté client, c'est que la commande a été préservée sur la publication? Je ne pense pas que vous pouvez modifier le CLR objet que vous avez en session via javascript.
OriginalL'auteur Drithyin
Ne sais pas si cela aide, remplacer <%# Eval("ProjectAbbrev") %> avec le lien Hypertexte.Le texte attribué à la OnQueueRepeater_ItemDataBound méthode et de voir si toutes les lignes sont remplies correctement.
Ce ne sera probablement pas résoudre votre problème, mais il sera intéressant de connaître le résultat.
Oui j'ai eu ce que vous vouliez dire. Btw, ne vois pas de listes déroulantes dans votre code, comment était le databinding fait? Essayez de rendu de texte/de l'étiquette pour les cases à cocher et les listes déroulantes sans les contrôles. Voir si les valeurs sont rendus.
OriginalL'auteur o.k.w