c# - 回发后 Listview 未在 databind() 上完全更新

标签 c# asp.net data-binding listview postback

我有一个 ListView 控件,它表现出一种奇怪的行为 - 行在回发后仅部分更新。我希望这里有人可以阐明为什么会发生这种情况。

我的 ListView 数据源绑定(bind)到存储在页面 session 状态中的项目列表。这是有意的,部分是为了超时过时的 View ,因为多个用户查看数据。在普通的度假村操作中,排序是通过 javascript 在页面上处理的,列表/ session 数据顺序通过回调保持同步。回调还检查权限级别。在更复杂的特定度假村操作中,页面上的 javascript 会回发到页面以处理排序逻辑。 List/Session 在回调中被更新,然后 listview 控件被反弹到数据。页面再次加载,行显示新顺序。没问题吧?

问题是 ListView 中的一些 元素没有根据新顺序更改值。虽然在页面上处理的超链接和文本(例如 <%# Eval("ProjectAbbrev") %>)会适当更新,但通过 OnItemDataBound 事件方法设置值的复选框、文字和下拉列表不会 - 它们会保留“卡住”到位,即使单步执行代码表明该方法在回发期间运行,并且控件应该设置为它们的新值。如果我去手动截断列表说,原始大小的一半,肯定只有那些项目被重新填充,但复选框等仍然保留其原始值。

所以我的问题是:为什么这些元素不与回发中的其余 ListView 控件元素一起更新?我感觉我要么误解了 ASP.NET 中的页面生命周期,要么遇到了某种错误。

在这一点上,我想我必须将更复杂的排序操作移动到 javascript 中的页面,但这将是相当棘手的,我想尽可能避免这样做。


更新:我已经尝试将 EnableViewState 设置为 false,但它没有解决这个问题。在任何情况下我都不能使用该策略,因为页面的其他部分(保存)最终依赖于读取 View 状态。
更新:我提供了一些代码片段,希望它们可以阐明这个问题:

Page:HyperLink 元素将在回发后正确更新,但在 OnQueueRepeater_ItemDataBound 方法中分配了值的 CheckBox 将保持不变。

<%@ 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>

代码隐藏:在回发时,执行以下代码:

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

更新:我已经放弃让它工作并使用 javascript 将我的排序逻辑移动到客户端。如果有人对为什么会发生这种奇怪的行为有任何想法,我仍然很想听听他们的意见!

最佳答案

出于兴趣,您在页面上的哪个点进行数据绑定(bind)?页面加载?

在 OnPreRender 上试试 - 可能会有帮助。

关于c# - 回发后 Listview 未在 databind() 上完全更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/821053/

相关文章:

c# - 仅使用 access_token 使用 Twitter API 进行简单查询

c# - 通过 Gmail SMTP 发送电子邮件无限期挂起而没有错误

asp.net - 如何使用 MVC5 ASP.NET Identity Framework 对 SignalR .NET 客户端进行身份验证

android - android绑定(bind)数据的通用形式

c# - WPF 自定义控件 : Bind CollectionViewSource to DependencyProperty

c# - COM 互操作性和继承

c# - 对于 C# 列表,如何在一条记录的值更改时对列重新排序?

wpf - 将两个 UserControl 绑定(bind)到同一个 DataContext 或 ViewModel?

c# - XmlDocument.Load 失败,LoadXml 有效 :

c# - 仅当用户电子邮件地址包含破折号时,AddToRole() 才返回 "User name can only contain letters or digits"