Listview在回发后没有完全更新databind()

pat*_*jbs 5 c# asp.net data-binding postback listview

我有一个ListView控件,它表现出奇怪的行为 - 在回发后行只是部分更新.我希望这里有人可以解释为什么会出现这种情况.

我的listview DataSource绑定到存储在页面会话状态中的项列表.这是故意的,部分是为了超时过期的视图,因为多个用户查看数据.在普通的度假村操作中,通过javascript在页面上处理排序,并且通过回调使列表/会话数据顺序保持同步.回调还会检查权限级别.在更复杂的特定度假操作上,页面上的javascript对页面进行回发以处理排序逻辑.列表/会话在回调中更新,然后列表视图控件将反弹到数据.页面再次加载,行显示新订单.没问题,对吧?

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

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

此时我认为我将不得不在javascript中将更复杂的排序操作移动到页面,但这将是相当棘手的,我想尽可能避免这样做.


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

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>
Run Code Online (Sandbox Code Playgroud)

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

tim*_*tim 6

出于兴趣,页面上的哪一点是你数据绑定?Page_Load中?

在OnPreRender上尝试一下 - 可能有所帮助.